遇到面試的乙個程式設計題:三個返回promise物件的非同步操作,讓你寫乙個函式可以將這些操作順序執行,並返回乙個陣列包含三個非同步物件的結果
非同步物件:
//非同步函式a
var a =function () ,
1000
) })}//
非同步函式b
var b =function () )}//
非同步函式c
var c =function () ,
500)
})}
注意:promise物件在例項化的時候就會執行,所以函式都是返回promise物件,這樣執行函式的時候就會執行promise物件中的內容
我們期望的結果是:
//a//b//c
//(3) ["a", "b", "c"]
//done
所以關鍵是怎麼順序執行promise並把結果乙個乙個塞到陣列裡
注意promise物件是不能直接得到resolve傳來的結果的,一般的方式是.then裡面寫resolve的**函式,所以剛才的需求可以這樣寫
var mergepromise = asyncfunction mergepromise(arr) )})}
return mergedajax.then(()=>)
};mergepromise([a,b,c]).then(function (data) );
還有這種寫法:
var mergepromise = async functionmergepromise(arr) )
}return mergedajax.then((val)=>)
};mergepromise(ajaxarray).then(
function
(data) );
以上兩種其實是乙個then的鏈式呼叫,最後返**集了非同步結果的陣列
這個需求用asnyc await的寫法就比較好看和直觀
asyncfunction queue(arr)
return
data
}queue([a, b, c])
.then(data =>);
感覺上是返回了乙個data陣列,應該會報沒有.then方法的錯誤,然而實際上是返回了乙個promise.resolve(data)
至於為什麼能將resolve的值抽離出來,是應為await是generator的語法糖,比如乙個asnyc函式:
async function myfn(arr)
myfn([a,b,c])其實等價於自動執行的generator函式
functionspawn(genf)
catch
(e)
if(next.done)
promise.resolve(next.value).then(
function
(v) );//
這裡gen.next(v)執行賦值操作 let res = v 也就是為什麼async方法能得到promise中resolve的值
}, function
(e) );
});}
step(
function() );
});}function
fn(args) );
}fn()
最後說一下,如果要讓非同步操作併發,可以用promise自帶的all方法
promise執行順序總結
1 const promise new promise resolve,reject promise.then console.log 5 執行結果是 1,2,5,4 解釋 promise的建構函式是同步執行,promise.then中的函式是非同步執行。2 const promise new pr...
ES6 Promise 並行執行和順序執行
1.promise.all 並行執行promise geta和getb並行執行,然後輸出結果。如果有乙個錯誤,就丟擲錯誤 每乙個promise都必須返回resolve結果才正確 每乙個promise都不處理錯誤 const geta new promise resolve,reject 1000 t...
ES6 Promise 並行執行和順序執行
geta和getb並行執行,然後輸出結果。如果有乙個錯誤,就丟擲錯誤 每乙個promise都必須返回resolve結果才正確 每乙個promise都不處理錯誤 const geta newpromise resolve,reject 1000 then result result const get...