promise根据返回类型的执行顺序2

问题描述 投票:0回答:1

这道题和之前的“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>
javascript function asynchronous promise execution
1个回答
0
投票

在第 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
稳定下来的情况。

© www.soinside.com 2019 - 2024. All rights reserved.