当我们使用链链接承诺的,并且承诺由然后返回时,那么不是一部分的代码如何在完成链之前运行链呢?代码如何跳过然后调用?难道不应该在运行"console.log“代码行之前执行所有调用吗?
以下是代码:
Promise.resolve('333')
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {setTimeout(function(){console.log('Timeout');resolve(1);},10000);console.log('Something');})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(2);})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(3);})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(4);})})
console.log("When?")在输出“什么时候?”是先印刷的..。现在我不知道怎么可能,因为第一个回调只在大约10秒内运行,然后回调将返回一个承诺,运行第二个,然后运行?也许我不明白然后的回调是如何与当时的函数“匹配”的。我认为然后实现看起来有点像:
then(callback){
let value= callback();
if(value is promise){
return value;
}
return Promise.resolve(value)
}发布于 2021-01-09 23:43:20
问得好。答案是事件循环,它评估JavaScript。简而言之,有微任务和宏任务。控制台日志是宏任务,承诺是微任务。事件循环首先处理宏任务,然后处理微任务。
有关更深入的解释,请参见:https://medium.com/javascript-in-plain-english/javascript-event-loop-y-promises-951ba6845899
问题中有一个部分的代码几乎是相同的。搜索console.log('start');来找到它。
发布于 2021-01-09 21:59:27
看上去你对Javascript很陌生。我也是,这件事经常搅乱我。console.log总是先打印,因为它不在“然后”里面。Js将异步运行日志,这意味着它不会等待承诺完成。要解决这个或更好的问题,请在.then中使用日志或使用Promise.all(PromiseName).then(在这里登录),以确保不会发生这种情况。
希望我能帮上忙!这可能对对象/承诺也有帮助
PS:我的第一个答案,如果我做错了什么,请告诉我。
发布于 2021-01-10 00:13:51
这是因为承诺中的代码是异步的,异步代码总是在执行了所有同步代码之后执行的。
在您的示例中,有两个同步指令,第一行是设置承诺链和console.log的行。因此,首先JavaScript设置承诺,然后记录When。只有在此之后,它才会一个接一个地解决承诺。
如果您想让代码按照您期望的方式运行,可以将其包装到一个async function中,然后使用await关键字停止同步代码的执行,直到解决了这些约定:
//async is actually creating a promise under the hood for you
async function imAsyncFunction () {
// await will make sure that before proceeding to the next
// synchronous instruction (the console.log) the promise chain is resolved
await Promise.resolve('333')
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {setTimeout(function(){console.log('Timeout');resolve(1);},10000);console.log('Something');})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(2);})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(3);})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(4);})});
console.log("When?");
}
imAsyncFunction();
// the log produced will be:
// 333
// Something
// Timeout
// 1
// Something
// 2
// Something
// 3
// Something
// When?https://stackoverflow.com/questions/65647954
复制相似问题