jsのpromiseの面接問題について.

2591 ワード

コアポイントpromiseはライフサイクル内にpending,fulfilledまたはrejectedの3つの状態があり,状体変化はpending−fulfilled,またはpending−rejectedのみである.そして状態が変わると再び変えることはできません.
問題1
 

promise.resolve().then(() => {
         console.log('a');
         return new Error('error');
     })
     .then((res)=>{
         console.log('b');
         console.log('then:',res);
     })
     .catch((err) =>{
         console.log('c');
         console.log('catch:',err);
     })

new Error()が現れると、後ろのcatch関数が実行されると思っている学生もいるかもしれませんが、そうではありません.
then関数の中でreturnは1つのErrorを出して、依然として正常な流れに従って歩いていくことができて、後続のcatch関数を実行することはできなくて、これはthorwが1つのErrorを投げたのと同じではありませんて、throwが1つのErrorを投げたならばcatch関数に捕獲されます.
因次の答えは次のとおりです.
a
b
c
then:Error : error


問題2
   const promise = Promise.resolve()
                       .then(()=>{
                           return promise;
                       });
       promise.catch(console.error);

結果は
TypeError:Chaining cycle detected for promise #

Promiseのthenやcatchではpromise自体に戻れないことを知っておく必要があります.そうしないと、死のループが発生します.上記のエラーです.
問題3
Promise.resolve(1)
       .then(2)
       .then(Promise.resolve(3))
       .then(console.log);

この問題は主にPromiseのthenあるいはcatchメソッドにおいて,受信したのは関数であり,関数のパラメータはresolveあるいはrejiect関数の戻り値であり,入力した値が非関数であれば値の貫通現象を生じることを考察する.値透過現象とは、伝達された値が直接無視され、チェーン呼び出しの後続の方法を継続することである.だから問題3の答えは1です.最初のthenは値2を受け入れ,2番目はPromiseを受信するが,いずれも必要な関数ではないため,この2つのthenは値透過を生じる.3番目のthenはconsoleを受信したためですlog関数は、そのため実行され、このとき最初のresolve(1)の値が受信されるので、最後に1を返す.
問題4
   Promise.resolve()
       .then(function success(res){
           throw new Error('error');
       },function faill(e){
           console.error('fail1:',e);
       })
       .catch(function fail2(e){
           console.error('fail2',e);
       })

Promiseのthenメソッドでは、resolveに成功した関数とrejectに失敗した関数の2つの関数を受信できます.2つの関数は1つしか呼び出されません.私たちはまだ通過することができます.catchメソッドはthenメソッドの2番目の失敗を表す関数を実現する.
しかし、少し違うのは.catch法は,then法から放出されたErrorを捕獲することができ,then法の第2の方法は,第1の処理に成功した方法で放出されたErrorを捕獲することができなかった.
だから私たちはこの問題の答えを出すことができて、fail 2のErrorを投げ出すことができます.
上記のテーマは次のコードで理解できます.
Promise.resolve()
    .then(function success1 (res){
        thorw new Error('error');
    },function() fail1(e){
        console.error('fail1',e);
    })
    .then(function success2(res){},function fail2(e){
        console.error('fail2:',e);
    })