Promise 是 JavaScript 語(yǔ)言提供的一種標(biāo)準(zhǔn)化的異步管理方式,它的總體思想是,需要進(jìn)行的IO,等待或者其他異步操作的函數(shù),不返回真是的結(jié)果,而返回一個(gè)“”承諾“”,函數(shù)的調(diào)用方可以在合適的時(shí)機(jī),選擇等待這個(gè)承諾兌現(xiàn),(通過(guò)Promise的then方法實(shí)現(xiàn))
Promise 的基本用法示例如下
function sleep (duration){
return new Promise(function(resolve,reject){
setTimeout(resolve,duration);
})
}
sleep(1000).then(()=> console.log("finished"))
接下來(lái)我們?cè)囋嚫?setTimeout 混用的 Promise,在這段代碼中,我設(shè)置了兩段互不干擾的異步操作:通過(guò)setTimeout執(zhí)行console.log('d'),通過(guò)promise執(zhí)行console.log('c')
var r = new Promise(function(resolve,reject){
console.log('a')
resolve ()
})
setTimeout(()=>console.log('d',0)
r.then(()=>console.log('c'));
console.log('b')
這段代碼的執(zhí)行結(jié)果是a,b,c,d,其原因在于Promise產(chǎn)生的是javaScript引擎內(nèi)部的微任務(wù),而setTimeout是瀏覽器API,它產(chǎn)生宏觀任務(wù),微任務(wù)始終先于一個(gè)宏觀任務(wù)
為證實(shí)這一結(jié)果我們可以設(shè)計(jì)一個(gè)實(shí)驗(yàn),執(zhí)行一個(gè)耗時(shí)一秒的promise
setTimeout(()=>console.log("d"), 0)
var r = new Promise(function(resolve, reject){
resolve()
});
r.then(() => {
var begin = Date.now();
while(Date.now() - begin < 1000);
console.log("c1")
new Promise(function(resolve, reject){
resolve()
}).then(() => console.log("c2"))
});
執(zhí)行結(jié)果為c1,c2,d
在ES6語(yǔ)法當(dāng)中又新增加了async/await
async/await 是 ES2016 新加入的特性,它提供了for,if等代碼結(jié)構(gòu)來(lái)編寫異步的方式。它運(yùn)行的基礎(chǔ)是promise
它的用法
function sleep(duration) {
return new Promise(function(resolve, reject) {
setTimeout(resolve,duration);
})
}
async function foo(){
console.log("a")
await sleep(2000)
console.log("b")
}