这道题和之前的“Promise根据返回类型的执行顺序”类似,但是有点不同。
为什么caseA和caseB的执行顺序不一样?
代码之间的区别是“返回”或“返回承诺”
案例A:914258367
<html>
<head>
<script>
var promise = Promise.resolve();
promise = promise.then(function(rtnVal) {
console.log('1');
var promise2 = Promise.resolve();
promise2 = promise2.then(function(rtnVal) {
console.log('2');
});
promise2 = promise2.then(function(rtnVal) {
console.log('3');
});
console.log('4');
return;
});
promise = promise.then(function(rtnVal) {
console.log('5');
var promise2 = Promise.resolve();
promise2 = promise2.then(function(rtnVal) {
console.log('6');
});
promise2 = promise2.then(function(rtnVal) {
console.log('7');
});
console.log('8');
return;
});
console.log('9');
</script>
</head>
</html>
caseB:91423 -> 5,6,7,8 甚至不运行
<html>
<head>
<script>
var promise = Promise.resolve();
promise = promise.then(function(rtnVal) {
console.log('1');
var promise2 = Promise.resolve();
promise2 = promise2.then(function(rtnVal) {
console.log('2');
});
promise2 = promise2.then(function(rtnVal) {
console.log('3');
});
console.log('4');
return promise;
});
promise = promise.then(function(rtnVal) {
console.log('5');
var promise2 = Promise.resolve();
promise2 = promise2.then(function(rtnVal) {
console.log('6');
});
promise2 = promise2.then(function(rtnVal) {
console.log('7');
});
console.log('8');
return promise;
});
console.log('9');
</script>
</head>
</html>
在第 2ns 示例中,第一个
promise
方法调用履行处理程序中的 return promise;
中的 then
指的是第一个 then
方法调用返回的 Promise,即 promise = promise.then(...)
。
这可以防止调用第二个
then
方法实现处理程序,因为 promise
永远不会实现。
以下代码是您的代码正在执行的操作的简化版本:
const p1 = Promise.resolve();
const p2 = p1.then(() => p2); // p2 will always be in pending state
p2.then(() => console.log("done")); // fulfillment handler never called
上面代码示例中
p2
的实现取决于p1.then(...)
方法调用的返回值。但返回的值是 p2
本身。这使代码处于 p2
等待 p2
稳定下来的情况。