Javascript 那么为什么';你不遵守回调的顺序吗?

Javascript 那么为什么';你不遵守回调的顺序吗?,javascript,asynchronous,promise,fetch,Javascript,Asynchronous,Promise,Fetch,我有以下代码: Promise .resolve('333') .then(()=>{setTimeout(()=>{Promise.resolve('123');},10000)}) .then(()=>{console.log("should wait");}); 我认为输出应该首先是“123”,然后是“应该等待”。由于原因不明,首先打印“应等待”。我认为第二个将不会启动,直到异步函数(setTimeout)没有完成。我读到这就是使用承诺的

我有以下代码:

Promise
  .resolve('333')
  .then(()=>{setTimeout(()=>{Promise.resolve('123');},10000)})
  .then(()=>{console.log("should wait");});

我认为输出应该首先是“123”,然后是“应该等待”。由于原因不明,首先打印“应等待”。我认为第二个将不会启动,直到异步函数(setTimeout)没有完成。我读到这就是使用承诺的所有“魔力”,然后。现在我很困惑。例如,为什么调用fetch函数时不会发生这种情况?fetch函数也是异步的,那么为什么在fetch结束之前,fetch之后的then不会启动呢?

除非
。然后
回调显式返回一个承诺,即下一个
。然后链中的
保证随后几乎立即运行(它被放入微任务队列)

现在,您没有返回任何内容,因此会返回
undefined
,因此第二个
。然后
会立即运行

如果希望第一个
。然后
使第二个等待超时完成,请返回一个在超时解决时解决的承诺:

Promise.resolve('333')
.然后(()=>{
返回新承诺((res)=>{
设置超时(()=>{
res('123');
}, 3000);
});
})

.then(()=>{console.log(“应该等待3秒”);})您的承诺链没有等待超时。
承诺
是否必须包装
设置超时
?难道不是另一种方式吗:setTimeout将包装承诺?不是,因为回调返回的值必须是承诺。
.then
回调不知道如何处理超时ID。承诺必须包装
setTimeout
。在我的情况下,承诺被确定为立即履行,因此下一步可以立即开始。在您的原始代码中,链中唯一的承诺是执行
Promise.resolve('333')
的原始承诺。
.then
中的承诺不会从
.then
返回,因此下一个
.then
不会等待它。