连接两个异步调用

Connect Two Async Calls

本文关键字:两个 异步 调用 连接      更新时间:2023-09-26

下面的JavaScript在SharePoint中向列表添加一个项目,并向图片库添加一个文件。添加函数调用上传函数,但我不希望添加函数完成,直到上传函数完成。当然,上传功能在大多数情况下需要更长的时间。最好的方法是什么?

添加项目到列表:

function addNewPunchlistItem() {
var endpointUrl = myURL + "PunchlistTracking/_api/web/lists/getbytitle('Punchlist Items')/items";
if ($('#getFile').val()) {
    uploadFile(myFormDigest, '#getFile', $('#itemNumber').val() + "_image.png");
}
call;
var call = $.ajax({
    url: endpointUrl,
    type: "POST",
    data: JSON.stringify({
        "__metadata": { type: "SP.Data.Punchlist_x0020_ItemsListItem" },
        Title: $('#itemShortDesc').val(),
        FSEId: $('#itemFSE').val(),
        PunchlistNumber: $('#itemNumber').val(),
        Open: $('#itemOpenDate').val(),
        Type: $('#itemType').val(),
        ResponsibleId: $('#itemResponsible').val(),
        LongDescription: $('#itemLongDesc').val(),
        ItemImage: { Description: "", Url: myURL + "PunchlistTracking/Lists/PicturesList/" + $('#itemNumber').val() + "_image.png" }
    }),
    headers: {
        Accept: "application/json;odata=verbose",
        "Content-Type": "application/json;odata=verbose",
        "X-RequestDigest": myFormDigest
    }
});
call.done(function (data, textStatus, jqXHR) {
    alert('Punchlist item ' + $('#itemNumber').val() + " added successfully.");
    init();
});
call.fail(function (jqXHR, textStatus, errorThrown) {
    alert('fail');
    var response = JSON.parse(jqXHR.responseText);
    var message = response ? response.error.message.value : textStatus;
    console.log(message);
});
}
上传文件:

function uploadFile(FormDigest, FileInput, fileName) {
var serverRelativeUrlToFolder = 'Lists/Pictures';
var fileInput = jQuery(FileInput);
var serverUrl = myURL + "PunchlistTracking";
var getFile = getFileBuffer();
getFile.done(function (arrayBuffer) {
    var addFile = addFileToFolder(arrayBuffer);
    addFile.fail(onError);
});
getFile.fail(onError);
function getFileBuffer() {
    var deferred = jQuery.Deferred();
    var reader = new FileReader();
    reader.onloadend = function (e) {
        deferred.resolve(e.target.result);
    }
    reader.onerror = function (e) {
        deferred.reject(e.target.error);
    }
    reader.readAsArrayBuffer(fileInput[0].files[0]);
    return deferred.promise();
}   //  getFileBuffer
function addFileToFolder(arrayBuffer) {
    var fileCollectionEndpoint = String.format(
            "{0}/_api/web/getfolderbyserverrelativeurl('{1}')/files" +
            "/add(overwrite=true, url='{2}')",
            serverUrl, serverRelativeUrlToFolder, fileName);
    return jQuery.ajax({
        url: fileCollectionEndpoint,
        type: "POST",
        data: arrayBuffer,
        processData: false,
        headers: {
            "accept": "application/json;odata=verbose",
            "X-RequestDigest": FormDigest,
            "content-length": arrayBuffer.byteLength
        }
    });
}   //  addFileToFolder
function onError(error) {
    alert(error.responseText);
}   //  onError
}   //  uploadFile

最好的方法是使用Promises,就像你已经在做的那样。让你的uploadFile函数返回一个promise,然后在该promise的"then"或"done"中进行第二个调用。就像你用getFileBuffer调用和addFileToFolder调用

所做的一样