談談 非同步事件 Promise 題型1

找抽的小陀螺發表於2017-10-14

聽到周圍說面試中 promise 被問到的概率在98%以上 之前談談promise 寫過 今天在賣弄一個題型

  • 首要說的狀態
    Promise的三種狀態 Pending進行中 Resolved已成功 Rejected已失敗
    Pending 到 Resolved
    pending 到 Rejected
    一旦建立就會立即執行 無法中途取消
    不設定回撥 內部丟擲的錯誤不會反應到外

  • 例子

function loadUserInfo(id) {
    return new Promise(function (resolve, reject){
        http.get(XXX, function(data) {
            resolve(data)
        })
    })
}
loadUserInfo (id).then(function(data){
    //成功
},function(err){
    //失敗
})複製程式碼

then 方法接受兩個函式的引數 第一個是成功的回撥 第二個是錯誤的回撥

  • 面試題(自個擴充套件的)
    window.onload = function() {
       setTimeout(function(){
         console.log(1)
       },0)
       var issuccess = true
       var promise =new Promise(function(resolve, reject){
         console.log(2)
         if (issuccess) {
           resolve(console.log("成功"))
         } else{
           reject(console.log("錯誤"))
         }
         console.log(3)
       })
       promise.then(function(){
         console.log(4)
       }, function(){
         console.log(5)
       })

       console.log(6)
     }複製程式碼

問 最後輸出什麼
答案在下面 我來賣弄下這裡的細節

  • 普及下非同步 事件
  1. js是一個單執行緒的 也就是說一個時間點上只能做一件事情
    為啥不是多執行緒那 像Java那樣 (網上加個人 見解) js作為瀏覽器指令碼語言 主要是來根據跟使用者的操作來操作dom 假如說多執行緒 第一個執行緒在dom上新增 第二執行緒在dom上刪除 瀏覽器不知道依誰為主 所以這就是想JavaScript這樣的指令碼語言不能搞成多執行緒一原因吧

  2. 但是如果有很多操作 單執行緒一個不好的地方就是 要等上一個事情處理完才可以處理這個事情 導致效能 載入等等慢的很多 這個時候要實現非同步操作 可是單執行緒如果搞那

  3. js的非同步是通過回撥函式來實現的 (執行緒+任務佇列) 執行緒主完成主要操作(同步的事情) 執行緒ok以後開始輪訓任務佇列 通過回撥取出來執行

    總結下 開始執行 1. 執行緒上執行所以操作(同步) 2.執行緒外開闢一個任務佇列 只要非同步任務有了結果就在任務佇列中放置一個事件 3. 執行緒上ok後 系統會自動讀取任務佇列裡面事件 4. 執行緒重複上面

  • promise 任務佇列執行優先順序
    es6中新增了一個Promise 在事件迴圈上 每次迴圈時候 先去es6Promsie 佇列中是否有任務執行 Promise 佇列優先高 也就是說執行緒ok了 去執行佇列棧中取出事件 上來Promise任務會首先執行 其他就沒有優先順序
  • 看看上面那道題吧

    執行緒開始執行操作(同步)
    任務佇列中 Promise有 優先順序
    setTimeout 加入任務佇列

    1. 列印是 2 //沒毛病吧 因為屬於主操作
    2. 列印是 成功 //沒毛病
    3. 列印是 3 //沒毛病
    4. 列印是 6 // .then 的回撥在任務佇列上
      執行緒上ok了 現在是任務佇列上的了
    5. 列印是 4 //上面說了Promise有優先順序
    6. 列印是 1 //任務佇列中最後

參考: es6.ruanyifeng.com/

相關文章