Mit dem folgenden JavaScript wird ein Element einer Liste und einer Datei einer Bildbibliothek in SharePoint hinzugefügt. Die Add-Funktion ruft die Upload-Funktion auf, aber ich möchte nicht, dass die Add-Funktion abgeschlossen wird, bis die Upload-Funktion abgeschlossen ist. Natürlich dauert die Upload-Funktion meistens länger. Was ist der beste Weg, dies zu tun?Verbinden von zwei asynchronen Anrufen
Artikel in Liste:
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);
});
}
Datei hochladen:
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
Sie verwenden können, tun 'promise.all()', wenn sie nicht im Zusammenhang Co und parallel ausgeführt werden können. Wenn nicht, können Sie zuerst die erforderliche asynchrone Operation ankündigen und dann '.then 'verwenden, um die zweite anzuhängen und die Auflösung der ersten zu verwenden. – Redu