2017-02-22 7 views
0

ループ内にあるネストされた約束から約束を返す最良の方法は何ですか?私は、いつどのようにして、約束を入れ子にするのかをどうやって使うのか分かりません。ForEachループ内のJqueryネストされた約束

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オブジェクトがほとんど非同期メソッドを持っていると仮定すると、ループが終了して約束が解決されるまで非同期操作が成功/ 。

Promise.all()は、約束事で包まれた非同期操作の配列を受け取り、すべてが合格した場合に解決するより良いパターンのようです。あなたのヘルパーメソッドのいくつかの再作業が必要ですが、ドキュメントをループし、すべてのドキュメント処理を配列に渡す約束事を追加し、結果の配列でPromise.all()を呼び出します。

+0

ええ、私はちょっと困っています。アップロードヘルパーは.ajax約束を返します。残りのAPI(SharePoint 2013)を呼び出すだけです。私は各ファイルをアップロードしてから、それぞれのドキュメントのlistitemを取得してから、それぞれのlistitemを更新します。チェーンの1つの部分でエラーが発生した場合にエラーを処理または処理する最善の方法は不明です。 – Fab

+0

ええ、それはPromise.all()の欠点です。一つの約束が拒絶されれば、すべてが拒絶される。約束の効用の大部分は、返品データにアクセスした後で確実に操作できることですが、最後の呼び出しから何も返されていないようです。何か動作していないのですか、それともより良いパターンを探していますか? –

+0

ちょうど良いパターンを探していて、ある文書がアップロードに失敗した場合でも続行したいと思いますが、呼び出しの外にループがあるので – Fab

関連する問題