关于Promise.then()的思考

在学习一个网络教程的过程中,我遇到了这么一个问题:

let p1 = new Promise(),
    p2 = new Promise();
function handler(){}
p1.then(function(){
    return p2.then(handler);
    })

像这种.then(callback)的callback中又return了一个.then(callback)的情况让我很困惑。我当时对promise粗浅的理解是:then就是字面上的意思:当异步操作完成,然后执行callback。那么then中的then这样的骚操作又如何理解呢?

先梳理一下promise的抽象概念。文档说promise是一种代理,代表一个尚未存在的值(或者错误)。这和我最初理解的“对异步操作的抽象”、“状态机”是否有出入呢?文档的这种说法显然更简洁、更抽象,那么带入到具体情况中如何理解呢?

关于.then()文档是这么说的:.then()的返回值是A Promise in the pending status。对比new Promise(callback)来分析,就是new操作会在new返回新的promise对象之前先执行callback,而相比之下.then(callback)返回的promise对象的callback不会执行,而是进入job queue,.then()返回的promise对象一直是pending状态,当链条中上一个promise的状态变为fullfilled的时候.then()的callback才变为可入栈状态。

也就是说,返回promise2的promise1在它resolve之后,保持pending状态,只有promise2状态变为fullfilled的时候,返回promise2返回的值,这等于是promise1被promise2取代了

结合promise代表一个尚未存在的值这个概念,then()中的then()可以理解为尚未存在的-尚未存在的值,这很抽象,但它可以类比setTimeout使用中出现的”回调地狱”来分析:

setTimeout(function(){ // callback1
    setTimeout(function(){ // callback2
        setTimeout(function(){ // callback3
            ...
        },0)    
    },0)    
},0)

callback2执行前callback3不存在 => callback2可以理解为“尚未存在的callback3”。
callback1执行前callback2不存在 => callback1可以理解为“尚未存在的callback2”
故,callback1就是”尚未存在的尚未存在的callback3”。显然,这样的抽象模型可以无限多层。

同理,.then()中的.then()意味着“尚未存在的promise”=> “尚未存在的尚未存在的值(或错误)”,同样可以叠加无限多层。

最后引用MDN文档的一段话:

如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。
如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。(一种类似stack return的概念)

你可能感兴趣的:(javascript)