我怎样才能做出瀑布 Q 承诺?
How can I make a waterfall Q promises?
我们以此为例:
- 我在数组 urls 中有 3 个 url
- 需要函数 returns 一个只进行 $http 调用的 promise
这是一个有效的代码,但由于数组可以是“1 到 n”,这显然不是我想要的。
我需要 3 require 作为瀑布,而不是并行。
在最后一个承诺中,我需要解决一个最终承诺,即 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);
这是一篇很棒的博客post: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();
});
只是提供另一种方法,有一个 "one-line" solution 无需另一种方法:
return promises.reduce($q.when, promises[0]);
在此处查看演示:http://plnkr.co/edit/xlGxYj57lzXdAMM5Iv6s?p=preview(我将默认 $q.when
更改为其他内容以显示处理每个承诺。)
更新:使 plunker 更能代表 OP 的场景。
我们以此为例:
- 我在数组 urls 中有 3 个 url
- 需要函数 returns 一个只进行 $http 调用的 promise
这是一个有效的代码,但由于数组可以是“1 到 n”,这显然不是我想要的。 我需要 3 require 作为瀑布,而不是并行。 在最后一个承诺中,我需要解决一个最终承诺,即 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);
这是一篇很棒的博客post: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();
});
只是提供另一种方法,有一个 "one-line" solution 无需另一种方法:
return promises.reduce($q.when, promises[0]);
在此处查看演示:http://plnkr.co/edit/xlGxYj57lzXdAMM5Iv6s?p=preview(我将默认 $q.when
更改为其他内容以显示处理每个承诺。)
更新:使 plunker 更能代表 OP 的场景。