2016-08-09 23 views
0

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 
+0

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

Antwort

0

Der beste Weg, dies mit dem Versprechen zu tun, wie Sie bereits tun. Holen Sie sich Ihre uploadFile Funktion, um ein Versprechen zurückzugeben, und im "dann" oder "getan" dieses Versprechen, dann den zweiten Anruf. Genau wie Sie mit dem getFileBuffer Anruf und den addFileToFolder Anruf