2017-02-22 7 views
0

Каков наилучший способ вернуть обещание от вложенных обещаний, которые находятся внутри цикла? Я не уверен, как использовать, когда и как уйти от вложенности обещаний.Jquery Nested Promises внутри цикла ForEach

function UploadDocuments() 
{ 

_.forEach(documentArray, function (document) { 

      uploadHelper.uploadFile(document.file, "Doclib").done(function (results) { 

       //success 
       uploadHelper.getDocumentListItem(results.d.ListItemAllFields.__deferred.uri).done(function (listItem) { 

        var payLoad = { 
         "Title": document.title, 
         "FileLeafRef": document.title, 
        }; 

        //success 
        uploadHelper.updateDocumentListItem(listItem.d.__metadata, payLoad).done(function() { 
         alert("Successfully Uploaded Document"); 

        }).fail(function() { 

         alert("Upload failed"); 
        }); 

       }).fail(function() { 

        alert("get listItem failed"); 
       }); 

      }).fail(function() { 

       alert("upload failed"); 
      }); 

     }); 

} 

Я хочу, чтобы иметь возможность вызвать эту функцию, вернуть обещание, а затем продолжить обработку. затем

UploadDocuments().then(function(){ 
     //continue 

});

ответ

0

Я не уверен, что есть отличный способ, или, по крайней мере, я не могу думать об этом, чтобы делать то, что вы делаете в цикле. Обещание может быть разрешено только один раз, так что это должно быть после завершения цикла, но если ваш объект uploadHelper имеет в основном методы асинхронной работы, нет никакой гарантии, что эти операции async были бы/неудачны по времени, когда цикл завершится, и обещание будет разрешено ,

Похоже, что лучшим шаблоном может быть Promise.all(), который принимает массив асинхронных операций, завернутых в обещания, и разрешает, если все они пройдут. Это потребует некоторой переделки ваших вспомогательных методов, но вы можете перебирать документы и добавлять обещание, которое выполняет всю вашу обработку doc в массиве, а затем вызывать Promise.all() в результирующем массиве.

+0

Да, я немного озадачен, uploadhelper возвращает обещание .ajax, это просто вызов для отдыха api (SharePoint 2013). Я загружаю каждый файл, затем получаю каждый список документов, а затем обновляю каждый список. Не уверен, что лучший способ связывать или обрабатывать ошибки, если одна часть цепи терпит неудачу. – Fab

+0

Да, это недостаток Promise.all(). Если одно обещание отвергается, то все это отвергается. Большая часть полезности обещания состоит в том, что вы уверены, что операция после того, как у нее будет доступ к возвращаемым данным, но похоже, что вы ничего не возвращаете из последнего вызова? Что-то не работает, или вы просто ищете лучшую картину? –

+0

Просто ищет лучший шаблон и хотел бы продолжить, если один документ не загрузится, но я предполагаю, что это произойдет, поскольку у меня есть цикл вне вызовов – Fab

 Смежные вопросы

  • Нет связанных вопросов^_^