我的印象是,一连串的Promise会回复'那时'链中的最后一个Promise。但是,当我测试以下内容时似乎并非如此:
function a() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('1');
resolve(1);
}, 1000);
}).then((num) => {
setTimeout(function() {
console.log('2');
return 2;
}, 1000);
});
}
a().then((num) => {
console.log('a is done running');
console.log('finally, ', num);
});
代码当前输出
1
a is done running
finally, undefined
2
只有当链中的所有Promise都已完成时,最底层的履行功能才会运行吗?
如何输出以下内容?
1
2
a is done running
finally, 2
答案 0 :(得分:4)
你可以通过实际返回一个新的承诺来做到这一点:
function a() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('1');
resolve(1);
}, 1000);
}).then((num) => {
return new Promise((resolve) => {
setTimeout(function() {
console.log('2');
return resolve(2);
}, 1000);
})
});
}
// the "then" here actually comes from the second promise.
a().then((num) => {
console.log('a is done running');
console.log('finally, ', num);
});
答案 1 :(得分:0)
我认为这只是因为你在第一个(控制台.log(2))中没有Promise ......所以它什么也没有返回,而且这个承诺是“立即”解决的。所以它执行“a is done running”等...然后它记录超时中的内容..希望它有所帮助;)