譯者按: 對於Promise,也許你會用了,卻並不理解;也許你理解了,卻只可意會不可言傳。這篇博客將從3個簡單的視角理解Promise,應該對你有所幫助。javascript
爲了保證可讀性,本文采用意譯而非直譯,而且對源代碼進行了大量修改。另外,本文版權歸原做者全部,翻譯僅用於學習。html
示例1中,asyncFunc()函數返回的是一個Promise實例:java
// 示例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實例的狀態變爲resolved,就會觸發then綁定的回調函數,打印resolve值,即"Hello, Fundebug!"。node
那麼,什麼是Promise呢?es6
示例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徹底等價。await的中文翻譯即爲"等待",這裏能夠"望文生義"。所以,相比於使用Promise實現,它更加直觀地展現了什麼是阻塞。promise
事實上,使用Promise實現時,也須要等待asyncFunc()執行,以後再調用then綁定的回調函數。所以,調用Promise時,代碼也是阻塞的。異步
若是某個函數返回Promise實例,則這個Promise最初至關於一個空白的容器,當函數執行結束時,其結果將會放進這個容器。示例3經過數組模擬了這個過程:async
// 示例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);
開始時,blank爲空數組,1秒以後,"Hello, Fundebug!"被添加到數組中,爲了確保成功,咱們須要在2秒以後從blank數組中讀取結果。函數
對於Promise,咱們不須要經過數組或者其餘變量來傳遞結果,then所綁定的回調函數能夠經過參數獲取函數執行的結果。
示例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!" });
調用asyncFunc()以後,sucesss數組實際上是空的,將回調函數push進數組,至關於綁定了事件的回調函數。1秒以後,setTimeout定時結束,則至關於事件觸發了,這時sucess數組中已經註冊了回調函數,因而打印"Hello, Fundebug!"。
當Promise成功resolve時,會觸發then所綁定的回調函數,這其實就是事件。
版權聲明:
轉載時請註明做者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/25/3-ways-to-understand-promise/