如何制作瀑布Q承诺?

时间:2015-04-30 19:43:54

标签: javascript angularjs promise q deferred

让我们以此为例:

  • 我在数组网址中有3个网址
  • require函数返回一个只发出$ http调用的承诺

这是一个有效的代码,但由于数组可以是'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吗?

2 个答案:

答案 0 :(得分:6)

创建一个处理迭代的函数:

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

go(urls);

答案 1 :(得分:2)

以下是一篇优秀的博文: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();
});