2017-09-09 62 views
-1

我正在通過鏈接https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_second_WebExtension。 我無法理解choose_beast.js腳本中的關鍵字then()。我知道這是與JavaScript中的承諾有關的東西。你能用簡單的語言解釋承諾,然後在這種情況下使用嗎?Asynchronous Promise然後()

+0

https://developers.google.com/web/fundamentals/getting-started/primers/promises https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

我已經讀過它,但不能簡單地理解。 –

+0

相關:[爲什麼我的變量在函數內部修改後沒有改變? - 異步代碼引用](https://stackoverflow.com/q/23667086) – Makyen

回答

0

讓我們來比較同步代碼和異步代碼。

尋找在一個正常的同步代碼:

let a = Date.now(); 
let b = a * 3; 

ab之前設置設定,這是可用於要使用的下一行

尋找在一個異步代碼:

let a = someAsyncFuntion(); 
let b = a * 3; // runs into error 

ab設置之前沒有設置,它不可用於b的下一行使用,因此會導致錯誤。

當下一個進程可用時,someAsyncFuntion()排隊運行。解析器移動到let b = a * 3;,但這裏的a尚未設置,所以會出現錯誤。

我簡單的話,在Promise函數排隊等待異步運行。因此,then()是當它完成它。

看看上面頁面上的例子:

var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true}); 
gettingActiveTab.then((tabs) => { browser.tabs.sendMessage(tabs[0].id, {beastURL: chosenBeastURL}); }); 

browser.tabs.query()沒有立即運行,並不會立即得到結果。因此,我們編寫代碼,以便在得到結果then()時做一些事情。

// query tabs asynchronously 
var gettingActiveTab = browser.tabs.query({.....}); 

// once got the result THEN do something 
gettingActiveTab.then(/* do something */); 

我希望有幫助。