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
转换为函数并在
中调用它,然后