聽到周圍說面試中 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)
}複製程式碼
問 最後輸出什麼
答案在下面 我來賣弄下這裡的細節
- 普及下非同步 事件
js是一個單執行緒的 也就是說一個時間點上只能做一件事情
為啥不是多執行緒那 像Java那樣 (網上加個人 見解) js作為瀏覽器指令碼語言 主要是來根據跟使用者的操作來操作dom 假如說多執行緒 第一個執行緒在dom上新增 第二執行緒在dom上刪除 瀏覽器不知道依誰為主 所以這就是想JavaScript這樣的指令碼語言不能搞成多執行緒一原因吧但是如果有很多操作 單執行緒一個不好的地方就是 要等上一個事情處理完才可以處理這個事情 導致效能 載入等等慢的很多 這個時候要實現非同步操作 可是單執行緒如果搞那
- js的非同步是通過回撥函式來實現的 (執行緒+任務佇列) 執行緒主完成主要操作(同步的事情) 執行緒ok以後開始輪訓任務佇列 通過回撥取出來執行
總結下 開始執行 1. 執行緒上執行所以操作(同步) 2.執行緒外開闢一個任務佇列 只要非同步任務有了結果就在任務佇列中放置一個事件 3. 執行緒上ok後 系統會自動讀取任務佇列裡面事件 4. 執行緒重複上面
- promise 任務佇列執行優先順序
es6中新增了一個Promise 在事件迴圈上 每次迴圈時候 先去es6Promsie 佇列中是否有任務執行 Promise 佇列優先高 也就是說執行緒ok了 去執行佇列棧中取出事件 上來Promise任務會首先執行 其他就沒有優先順序
看看上面那道題吧
執行緒開始執行操作(同步)
任務佇列中 Promise有 優先順序
setTimeout 加入任務佇列- 列印是 2 //沒毛病吧 因為屬於主操作
- 列印是 成功 //沒毛病
- 列印是 3 //沒毛病
- 列印是 6 // .then 的回撥在任務佇列上
執行緒上ok了 現在是任務佇列上的了 - 列印是 4 //上面說了Promise有優先順序
- 列印是 1 //任務佇列中最後