Promise.thenについての考え

2416 ワード

インターネットの教程を勉強しているうちに、こんな問題に出会いました.
let p1 = new Promise(),
    p2 = new Promise();
function handler(){}
p1.then(function(){
    return p2.then(handler);
    })
このように.then(calback)のcall backの中でもう一つ.then(calback)の場合は困ります.プロミスについて浅はかに理解していたのは、thenは文字通り、非同期操作が完了したら、calbackを実行するという意味だった.thenのthenのような騒ぎ出しの操作はどのように理解されますか?
まずプロモーションの抽象概念を整理します.文書によると、プロミスはプロキシで、まだ存在していない値(またはエラー)を表しています.これは私が最初に理解した「非同期操作の抽象」「状態機」との違いがありますか?文書のこのような言い方は明らかにもっと簡潔で抽象的です.
について.then()ドキュメントはこう言います.then()の戻り値はA Promise in the pending statusです.new Promiseを比較して分析すると、new操作はnewが新たなpromiseオブジェクトに戻る前にcalbackを実行します.それに比べて、then(calback)が戻ってきたpromiseオブジェクトのcalbackは実行されず、job queueに入ります.のcalbackがスタック状態になりました.
つまり、promise 2に戻るpromise 1は、そのresoliveの後、pending状態を維持し、promise 2だけがフルフィルド状態になった時、promise 2に戻ってきた値です.これはpromise 1がpromise 2に取って代わられたものです.
promiseはまだ存在していない値という概念を表しています.then()のthen()はまだ存在していない-まだ存在していない値として理解できます.これは抽象的ですが、setTimeout使用中に出現した「回調地獄」と類比して分析できます.
setTimeout(function(){ // callback1
    setTimeout(function(){ // callback2
        setTimeout(function(){ // callback3
            ...
        },0)    
    },0)    
},0)
calback 2実行前のcalback 3は存在しませんでした.コールバック2は「存在していないコールバック3」と理解できます.calback 1は、実行前にcalback 2が存在しませんでした=>calback 1は「まだ存在していないcalback 2」と理解できますので、calback 1は、まだ存在していないコールバック3です.このような抽象的モデルは無限多層でありうることは明らかである.
同様に、then()における.then()は、「まだ存在していないプロミゼ」=>「未存在の値(またはエラー)」を意味し、同様に無限の重層を重畳することができる.
最後にMDN文書の一節を参照します.
thenのコールバック関数が未確定の状態(pending)のPromiseに戻ると、thenがPromiseに戻る状態は未定であり、その最終状態はそのPromiseの終状態と同じである.また、それが終状態になったときに呼び出すコールバック関数パラメータは、そのPromiseが終状態になったときのコールバック関数のパラメータと同じです.thenのコールバック関数がもう受け入れられている状態のPromiseを返すと、thenが戻ってきたPromiseも受諾状態となり、そのPromiseの受諾状態のコールバック関数のパラメータ値をこの返されたPromiseの受諾状態コール関数のパラメータ値とします.(stack returnのような概念)