免责声明:
以下示例均不建议在实际应用程序中使用,也不是最佳实践或任何东西。实际上,其中一些是The Deferred anti-pattern。我只是想演示它是如何工作的。
为了回答你的问题,我们先做一些实验。
给定这样的回调:
function okHandler(value) {
console.log(value + ' has been called.');
return value;
}
function doneHandler(values) {
console.log('Done! : ' + JSON.stringify(values));
}
function delayed(value, delay) {
var deferred = $q.defer();
$timeout(function () {
deferred.resolve(value);
}, delay);
return deferred.promise;
}
平行:
$q.all({
a: $q.when('a').then(okHandler),
b: $q.when('b').then(okHandler),
c: $q.when('c').then(okHandler),
}).then(doneHandler);
结果:
a has been called.
b has been called.
c has been called.
Done! : {"a":"a","b":"b","c":"c"}
与延迟模拟并行:
$q.all({
a: delayed('da', 200).then(okHandler),
b: delayed('db', 100).then(okHandler),
c: delayed('dc', 300).then(okHandler),
}).then(doneHandler);
结果:
db has been called.
da has been called.
dc has been called.
Done! : {"b":"db","a":"da","c":"dc"}
顺序:
delayed('sa', 400).then(okHandler).then(function () {
delayed('sb', 100).then(okHandler).then(function () {
delayed('sc', 10).then(okHandler).then(doneHandler);
})
});
结果:
sa has been called.
sb has been called.
sc has been called.
Done! : "sc"
顺序替代样式:
delayed('ssa', 600)
.then(okHandler)
.then(delayed.bind(null, 'ssb', 100))
.then(okHandler)
.then(delayed.bind(null, 'ssc', 10))
.then(okHandler)
.then(doneHandler);
结果:
ssa has been called.
ssb has been called.
ssc has been called.
Done! : "ssc"
Plunker 示例: http://plnkr.co/edit/dNZ8koAS4G6fNmahfmj6?p=preview
现在让我们看看你的问题。
问:执行是否总是保证为func1、func2、func3、func4?
A:不,只有func4 保证最后执行。 func1、func2 和 func3 可以按任意顺序执行。
问:$q.then(callbacks).then 是否总是在触发下一个 then 之前触发回调?
答:是的!