3 回答

TA貢獻1829條經(jīng)驗 獲得超7個贊
對于正在尋找快速參考的人以及使用promises和async / await的一些示例,這里有一個更簡潔的答案。
對于調(diào)用異步方法(在本例中setTimeout
)并返回消息的函數(shù),從樸素方法(不起作用)開始:
function getMessage() { var outerScopeVar; setTimeout(function() { outerScopeVar = 'Hello asynchronous world!'; }, 0); return outerScopeVar;}console.log(getMessage());
undefined
在這種情況下記錄,因為getMessage
在setTimeout
調(diào)用回調(diào)之前返回并更新outerScopeVar
。
解決它的兩種主要方法是使用回調(diào)和承諾:
回調(diào)
這里的更改是getMessage
接受一個callback
參數(shù),該參數(shù)將被調(diào)用以在可用時將結果傳遞回調(diào)用代碼。
function getMessage(callback) { setTimeout(function() { callback('Hello asynchronous world!'); }, 0);}getMessage(function(message) { console.log(message);});
Promise提供了一種比回調(diào)更靈活的替代方案,因為它們可以自然地組合起來協(xié)調(diào)多個異步操作。甲承諾/ A +標準實現(xiàn)天然地在node.js中(0.12+)和許多當前瀏覽器提供的,而是在像庫還實現(xiàn)藍鳥和Q。
function getMessage() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve('Hello asynchronous world!'); }, 0); });}getMessage().then(function(message) { console.log(message); });
jQuery Deferreds
jQuery提供的功能類似于Deferreds的promises。
function getMessage() { var deferred = $.Deferred(); setTimeout(function() { deferred.resolve('Hello asynchronous world!'); }, 0); return deferred.promise();}getMessage().done(function(message) { console.log(message); });
異步/ AWAIT
如果您的JavaScript環(huán)境包括支持async
和await
(如Node.js的7.6+),那么你就可以在同步使用承諾async
的功能:
function getMessage () { return new Promise(function(resolve, reject) { setTimeout(function() { resolve('Hello asynchronous world!'); }, 0); });}async function main() { let message = await getMessage(); console.log(message);}main();
添加回答
舉報