承诺和操作顺序
2019-06-20
62
道歉,如果这是一个基本概念。 我是JavaScript的新手。
我正在尝试了解以下功能的执行顺序。 我设置了一个带有2个回调的承诺,然后立即使用3个回调的承诺。
546571540
输出如下(dl => double layer,tl => tly layer ):
418568782
它本来可以预期输出为双层,然后是三层层,但是事实并非如此。 我研究了提升,但是我已经阅读了它,它至少应该保护脚本中的执行顺序。 这些功能如何订购,为什么不以外观顺序执行它们?
如果需要更多详细信息,请提前询问,道歉和感谢。
2个回答
运行承诺时,每个
.then
处理程序都会异步运行,如
https://javascript.info/microtask-queue
基本上,对于您的代码来说,这意味着
- 主代码首先运行,DL1 排队,TL1 排队
- 当主代码执行结束时,DL1 首先进入队列,因此它执行并排队 DL2
- 当引擎完成 DL1 时,它会获取下一个排队项目; TL1,执行并排队 TL2。
- 现在队列中的下一个项目是 DL2,其余 TL 紧随其后
如果您确实需要承诺先解决 DL,然后再解决 TL,那么您需要让它们成为同一承诺链的一部分
2019-06-20
您示例中的执行顺序是正确的。
当涉及到异步操作(Promises)时,整个概念与同步操作略有不同。
在下面的解释中,您可以将 Promise 视为运行操作的计划/队列。
例如,使用此简化的代码:
function sum(a, b){
return new Promise(function(resolve, reject){
if (a < 0 || b < 0)
reject(new Error('Negative not supported.'));
else
resolve(a + b);
});
}
/* Double layer */
sum(5, 6).then(function(result){
console.log('DL1', result);
return sum(10, 20);
}).then(function(result){
console.log('DL2', result);
}).catch(function(error){
console.error(error);
});
/* Triple layer */
sum(5, 6).then(function(result){
console.log('TL1', result);
return sum(10, 20);
}).then(function(result){
console.log('TL2', result);
return sum(30, 40);
}).then(function(result){
console.log('TL3', result);
}).catch(function(error){
console.error(error);
});
如果我们遵循上述示例,执行队列将如下所示:
-
声明函数
sum
。 -
将函数
sum(5, 6)
作为 DL 运行。 -
返回 Promise(DL),
sum
(DL)的执行结束。 -
将函数
sum(5, 6)
作为 TL 运行。 Promise DL 在后台运行。 -
返回 Promise (TL),
sum
(TL) 的执行结束。Promise DL 在后台解析。 -
DL1
.then()
运行,因为 Promise DL 已在步骤 5 中解析。Promise TL 在后台解析。 -
TL1
.then()
运行,因为 Promise TL 已在步骤 6 中解析。DL1 在后台解析。 -
DL2
.then()
运行,因为 Promise DL1 已在步骤 7 中解析。Promise TL1 在后台解析。 - ...(您明白了)
如您所见,使用 Promises,一些操作在后台运行。这就是为什么你会看到执行顺序可能与它出现的顺序不一样。
yqlim
2019-06-20