Javascript 承诺不要等到下一步才解决
代码:Javascript 承诺不要等到下一步才解决,javascript,promise,Javascript,Promise,代码: var x = new Promise((resolve, reject) => { setTimeout( function() { console.log( 'x done' ); resolve() }, 1000 ); }); Promise.resolve().then(x).then((resolve, reject) => { console.log( 'all done' ); }); all do
var x = new Promise((resolve, reject) => {
setTimeout( function() {
console.log( 'x done' );
resolve()
}, 1000 );
});
Promise.resolve().then(x).then((resolve, reject) => {
console.log( 'all done' );
});
all done
x done
x done
all done
输出:
var x = new Promise((resolve, reject) => {
setTimeout( function() {
console.log( 'x done' );
resolve()
}, 1000 );
});
Promise.resolve().then(x).then((resolve, reject) => {
console.log( 'all done' );
});
all done
x done
x done
all done
预期输出:
var x = new Promise((resolve, reject) => {
setTimeout( function() {
console.log( 'x done' );
resolve()
}, 1000 );
});
Promise.resolve().then(x).then((resolve, reject) => {
console.log( 'all done' );
});
all done
x done
x done
all done
为什么承诺x
在调用下一个然后回调之前没有等待解决
JSFiddle:因此,当您想要在一个系列中运行承诺时,您应该将x
转换为函数并在中调用它,然后:
function x() {
return new Promise(resolve => {
setTimeout(() => {
console.log('x done');
resolve()
}, 1000);
});
});
Promise.resolve()
.then(x)
.then(() => console.log('all done'));
或最简单的变体:
x().then(() => console.log('all done'));
then
希望函数作为参数,而不是承诺。因为then()
需要函数作为参数,而不是承诺。因此,下一个then
在x运行后执行,而不是解析。您应该在then
中返回x
:then(()=>x)
。您的意思是x.then(()=>console.log('all done')代码>?@AlexanderMac-你能写下来作为答案吗。我会选择的。谢谢这很可能是一种反模式,最终可能会导致未经处理的拒绝。您不应该将承诺注入到这样的链中。@Bergi-您对在一个系列中运行承诺有什么建议?@Bergi请澄清为什么它不好。要在一个系列中运行它们,您需要从调用setTimeout
,然后(()=>…)
回调,例如在工厂函数中包装x
。当前,Promise.resolve()
和x
是并发的(如果需要,最好使用Promise.all
)。或者将x
转换为函数并在中调用它,然后
。