我试图了解Promise如何使用jQuery。 这是我的沙箱:
function test1() {
var deferred = $.Deferred()
setTimeout(function() {
deferred.resolve(1);
//deferred.reject(2);
}, 2000);
return deferred.promise();
}
function test2() {
var deferred = $.Deferred()
setTimeout(function() {
deferred.resolve(2);
// deferred.reject(2);
}, 1000);
return deferred.promise();
}
function doTest(){
$.when(test1()).then(
function (a) {
console.log('test1 finished', a)
return test2();
},
function (a) {
console.log('something failed in test1', a)
}
).then(
function (b) {
console.log("test2 finished", b);
},
function (b) {
console.log("something failed in test1", b);
}
);
}
它按照我的预期工作 - 写作:
test1完成1
test2完成了2
但是当我改变它时如下:
function test1() {
var deferred = $.Deferred()
setTimeout(function() {
// deferred.resolve(1);
deferred.reject(2);
}, 2000);
return deferred.promise();
}
function test2() {
var deferred = $.Deferred()
setTimeout(function() {
deferred.resolve(2);
// deferred.reject(2);
}, 1000);
return deferred.promise();
}
它写入控制台:
test1 2中的某些内容失败
test2完成未定义
什么是不正确的,因为test2还没有被执行。
我希望," test2完成未定义"不应该显示。
我猜第二次出现问题,但是什么?
答案 0 :(得分:0)
您的问题实际上在第一个then
的onRejected函数中。具体来说,因为你“返回”一个值" (未定义),然后链中的下一个then
处理程序将其视为履行承诺。
$.when(test1()).then(
function (a) {
console.log('test1 finished', a)
return test2();
},
function (a) {
console.log('something failed in test1', a)
// Your problem is here.
}
).then(
function (b) {
console.log("test2 finished", b);
},
function (b) {
console.log("something failed in test1", b);
}
);
在某些情况下,这可能很有用:
$.when(riskyFunction()).then(
function (value) {
return processValue(value);
}, function (error) {
console.log(error);
return defaultValue; // This lets you recover...
}).then(function (value2) {
return processValue2(value2); // so this handler runs regardless of
// riskyFunction's return value.
});
与同步代码相比,它匹配一个狭窄的try
块:
try {
a = test1();
b = test2();
} catch (e) {
console.log('something failed in test1', a)
}
console.log("test2 finished", b); // this runs even if test1 or test2 fails,
// but in those cases b is undefined!
相反,您应该删除错误处理程序并在最后或至少return $.reject(a)
或throw a
捕获错误,以便继续关注then
处理程序中的错误链。