簡體   English   中英

我如何制作瀑布Q承諾?

[英]How can I make a waterfall Q promises?

我們以此為例:

  • 我在一個數組網址中有3個網址
  • require函數返回一個只發出$ http調用的promise

這是一個工作代碼,但由於數組可以是'1到n',這顯然不是我想要的。 我需要3個需求作為瀑布,而不是並行。 在最后的承諾中,我需要解決最終的承諾,即var deferred。

require(urls[0]).then(function () {                            
    require(urls[1]).then(function () {                                
        require(urls[2]).then(function () {                                    
            deferred.resolve();
        });
    });
})

這種方法不起作用,因為這將並行執行所有$ http調用。

var promises = [];
angular.forEach(urls, function (value) {
    promises.push(require(value));
});
$q.all(promises).then(function () {
    deferred.resolve();
});

是否有一個很好的方法來執行for / cycle?

創建一個函數來處理迭代:

function go (urls) {
    if (urls[0]) {
      require(urls[0]).then(function () {
          go(urls.slice(1));
      });
    }
}

go(urls);

這是一篇很棒的博文: http//www.codeducky.org/q-serial/

我將只分享相關的部分。

首先我們定義這個輔助方法:

function serial(tasks) {
  var prevPromise;
  angular.forEach(tasks, function (task) {
    //First task
    if (!prevPromise) { 
      prevPromise = task(); 
    } else {
      prevPromise = prevPromise.then(task); 
    }
  });
  return prevPromise;
}

然后我們使用它。

serial([
  function() { return require(urls[0]) },
  function() { return require(urls[1]) },
  function() { return require(urls[2]) }
]).then(function () {
    deferred.resolve();
});

只是提供另一種方式,有一個“單線”解決方案 ,而無需另外的方法:

return promises.reduce($q.when, promises[0]);

請參閱此處的演示: http$q.when (我將默認的$q.when更改為其他內容以顯示處理每個承諾。)

更新:使得plunker更能代表OP的情景。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM