Promiseとasync await面接の知識点

3241 ワード

Promiseの正常な使い方
function xx(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resovle('     ')
            reject('    ')
        },3000)
    })
}

xx().then(fn1,s1).then(fn2,s2)//fn      ,s      
PromiseのAPI
  • Promise.resove()製造成功または失敗
  • Promise.reject()製造失敗
  • Promise.allは、すべての成功を待っています.または、失敗があります.
  • Promise.race(配列)は、最初の状態変化を待つ
  • Promise.all Settledは、すべての状態が変化するのを待っています.APIは新しいので、ブラウザがサポートするのは
  • より少ないです.
    プロミスの文法飴
    Promise.then(fn 1).catch(s 1)イコールPromise.then(fn 1,s 1) 
    Promiseの面接問題
    ページには2つのボタン AとBと入力ボックスがあります.Aボタンをクリックして、一つの要求を送ります.一つの文字列Aに戻ります.Bも要求を送りますが、文字列Bに戻ったら文字列を入力ボックスに割り当てます.しかし、AとBが送った二つの要求は戻り時間が違っています.二つのボタンをクリックした順番も違います.BはAより先に戻ります.最終的な効果は、入力枠の文字の順序がABであることが要求されます.
    prmise.allはこの需要を満たしにくいです.これは1つの配列で彼らを記録する必要があります.Bが帰ってきたら、配列の中で比較します.順序は1ではなく、Aが帰ってきたら、Aを出力してからBを出力すればいいです.
    実現コードを直接見てください.
    
    
      
      
    
    let ajax1 = ()=>{
      return new Promise((resolve, reject)=>{
        setTimeout(()=>{
          resolve(1111)
        },5000)
      })
    }
    let ajax2 = ()=>{
      return new Promise((resolve, reject)=>{
        setTimeout(()=>{
          resolve(2222)
        },3000)
      })
    }
    
    let batai = []
    let duiwu = []
    
    let hi = () =>{
      let lastN = batai[batai.length - 1][0]
      let lastS = batai[batai.length - 1][1]
      console.log(duiwu,'  ')
      console.log(batai,'  ')
      if(duiwu[0][0] === lastN) {
        duiwu[0][1](lastS)
        duiwu.shift()
        batai.pop()
        hi()
      }
    }
    
    b1.onclick = ()=>{
      const n = 1
      ajax1().then(res=>{
        batai.push([n, res])
        hi()
      })
      duiwu.push([n, s=>{
        input1.value = s
      }])
    }
    
    b2.onclick = ()=>{
      const n = 2
      ajax2().then(res=>{
        batai.push([n, res])
        hi()
      })
      duiwu.push([n, s=>{
        input1.value = s
      }])
    }
     
    async awaitの基本的な使い方
    const fn = async ()=>{
        const fn1 = await newPromise()
        return fn1 + 1
    }
    Promiseと比較して、同期コードを書いているようにロックされていません.
    どうしてasync await関数の前にasyncがありますか? 
    古いコードに対応するために、async/await機能と同じawait関数を実現した人がいます.
    await(newPromise())
    ですから、区別をするために、関数の前にasyncを追加して示すのは違っています.他の特別な意味はありません. 
    async awaitエラー処理を最適化する
    よくあるエラー処理方法try/catch
    let response
    try{
        response = await axios.get('/xx')
    }.catch(err){
        if(err.response){
            console.log(err.response.states)
        }
        throw err
    }
    console.log(response)
    このように処理する感じはあまり良くなくて、私達は最適化することができて、Promiseを結び付けて次のコードを書きます.
    const response = await axios.get('/xx').then(null, err)
    console.log(response)
    レスポンス処理に成功した結果、then(null,err)のerr処理が失敗しました.
    async/awaitは実はPromiseの文法飴です.
    async await面接試験問題
    let a = 0;
    let test = async () => {
      a = a + await 10;
      console.log(a)
    }
    test()
    console.log(++a)
    ロゴはそれぞれ何を出力しますか?
    ここで考察している知識点:a+await 10の前のa  awaitと一緒に非同期によって確定されますか?それともaが先に値を確定しますか? 
    実際にawaitの前の値は同期して実行されます.awaitの後ろの方が非同期です.これを覚えておけばよく分かります.
    タイトルの中では先にロゴマークしましたが、+aは1です.しかし、test()関数ではa+ await 10  のaはtest()の運転時にすでに値を確定しました.値は0です.
    0+非同期のawait 10は10に等しい.