譯者按:對于Promise,也許你會(huì)用了,卻并不理解;也許你理解了,卻只可意會(huì)不可言傳。這篇博客將從3個(gè)簡單的視角理解Promise,應(yīng)該對你有所幫助。
公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出澤普免費(fèi)做網(wǎng)站回饋大家。
為了保證可讀性,本文采用意譯而非直譯,并且對源代碼進(jìn)行了大量修改。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
示例1中,asyncFunc()函數(shù)返回的是一個(gè)Promise實(shí)例:
// 示例1
function asyncFunc()
{
return new Promise(function(resolve, reject)
{
setTimeout(function()
{
resolve('Hello, Fundebug!');
}, 100);
});
}
asyncFunc()
.then(function(x)
{
console.log(x); // 1秒之后打印"Hello, Fundebug!"
});
1秒之后,Promise實(shí)例的狀態(tài)變?yōu)?strong>resolved,就會(huì)觸發(fā)then綁定的回調(diào)函數(shù),打印resolve值,即"Hello, Fundebug!"。
那么,什么是Promise呢?
示例2可以幫助我們理解阻塞:
// 示例2
function asyncFunc()
{
return new Promise(function(resolve, reject)
{
setTimeout(function()
{
resolve('Hello, Fundebug!');
}, 1000);
});
}
async function main()
{
const x = await asyncFunc(); // (A)
console.log(x); // (B) 1秒之后打印"Hello, Fundebug!"
}
main();
以上代碼是采用Async/Await語法寫的,與示例1完全等價(jià)。await的中文翻譯即為"等待",這里可以"望文生義"。因此,相比于使用Promise實(shí)現(xiàn),它更加直觀地展示了什么是阻塞。
事實(shí)上,使用Promise實(shí)現(xiàn)時(shí),也需要等待asyncFunc()執(zhí)行,之后再調(diào)用then綁定的回調(diào)函數(shù)。因此,調(diào)用Promise時(shí),代碼也是阻塞的。
如果某個(gè)函數(shù)返回Promise實(shí)例,則這個(gè)Promise最初相當(dāng)于一個(gè)空白的容器,當(dāng)函數(shù)執(zhí)行結(jié)束時(shí),其結(jié)果將會(huì)放進(jìn)這個(gè)容器。示例3通過數(shù)組模擬了這個(gè)過程:
// 示例3
function asyncFunc()
{
const blank = [];
setTimeout(function()
{
blank.push('Hello, Fundebug!');
}, 1000);
return blank;
}
const blank = asyncFunc();
console.log(blank); // 打印"[]"
setTimeout(function()
{
const x = blank[0]; // (A)
console.log(x); // 2秒之后打印"Hello, Fundebug!"
}, 2000);
開始時(shí),blank為空數(shù)組,1秒之后,"Hello, Fundebug!"被添加到數(shù)組中,為了確保成功,我們需要在2秒之后從blank數(shù)組中讀取結(jié)果。
對于Promise,我們不需要通過數(shù)組或者其他變量來傳遞結(jié)果,then所綁定的回調(diào)函數(shù)可以通過參數(shù)獲取函數(shù)執(zhí)行的結(jié)果。
示例4模擬了事件:
// 示例4
function asyncFunc()
{
const eventEmitter = {
success: []
};
setTimeout(function()
{
for (const handler of eventEmitter.success)
{
handler('Hello, Fundebug!');
}
}, 1000);
return eventEmitter;
}
asyncFunc()
.success.push(function(x)
{
console.log(x); // 1秒之后打印"Hello, Fundebug!"
});
調(diào)用asyncFunc()之后,sucesss數(shù)組其實(shí)是空的,將回調(diào)函數(shù)push進(jìn)數(shù)組,相當(dāng)于綁定了事件的回調(diào)函數(shù)。1秒之后,setTimeout定時(shí)結(jié)束,則相當(dāng)于事件觸發(fā)了,這時(shí)sucess數(shù)組中已經(jīng)注冊了回調(diào)函數(shù),于是打印"Hello, Fundebug!"。
當(dāng)Promise成功resolve時(shí),會(huì)觸發(fā)then所綁定的回調(diào)函數(shù),這其實(shí)就是事件。
Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了9億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!
轉(zhuǎn)載時(shí)請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/25/3-ways-to-understand-promise/
當(dāng)前標(biāo)題:理解promise的三種姿勢
文章源于:http://m.newbst.com/article34/jeehpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、用戶體驗(yàn)、Google、全網(wǎng)營銷推廣、云服務(wù)器、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)