为什么deferred.reject()
个调用中的任何一个都不会在最后触发.fail()
处理程序?如何使用嵌套的promises触发单个错误处理程序?我需要嵌套的承诺来封闭。
当我在d1
上触发拒绝时,它仍然会一直到d2
的解析/拒绝。如果我将.fail()
添加到d1
的块中,那么它确实可以捕获拒绝。但这就是我想要避免的,每个嵌套承诺的.fail()
处理程序。
var Q = require('q');
somePromise().then(function (v1) {
var d1 = Q.defer();
asyncFunc1(v2, function (err, v3) {
if (!v3)
d1.reject(new Error('error'));
else
d1.resolve(true);
return d1.promise.then(function (promise1Kept) {
var d2 = Q.defer();
asyncFunc2(v4, function (err, v5) {
if (!v5)
d2.reject(new Error('error'));
else
d2.resolve(true);
});
return d2.promise.then(function (promise2Kept) {
console.log('end of promise chain');
});
});
});
}).fail(function (err) {
console.log('Error!');
console.log(err);
});
答案 0 :(得分:1)
不要混合回调和承诺或使用延迟。正如您所注意到的,当您需要手动执行所有操作时,很容易弄乱链。
var Q = require('q');
var func1 = Q.denodeify(asyncFunc1);
var func2 = Q.denodeify(asyncFunc2);
somePromise().then(function (v1) {
return func1(v2);
}).then(function (v3) {
if (!v3) throw new Error("error");
return func2(v4);
}).then(function (v5) {
if (!v5) throw new Error("error");
console.log("end of promise chain");
}).fail(function (err) {
console.log('Error!');
console.log(err);
});