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
不会等待它。