2016-11-09 44 views
7

我開始使用ES7功能async/await,這給處理異步任務的最佳方法,使你的代碼更加清晰易讀。是否有可能解決異步函數沒有return關鍵字

但是,它不會讓您訪問由異步函數創建的Promise,因此如果您在異步函數中執行了一些異步請求,您應該對它進行promisify,然後等待它,然後返回結果。我的意思是這樣的:

async function doStuff() { 
    //stuff... 
    var value = await new Promise(function(resolve) { 
     $.get('http://some/url/...', function(result) { 
      // stuff... 
      resolve(result); 
     }); 
    }); 
    return value; 
} 

如果你能找到什麼指針由函數創建的承諾讓你的代碼可能是這樣的:

async function doStuff() { 
    //stuff... 
    var p = arguments.callee.promise; 
    $.get('http://some/url/...', function(result) { 
     // stuff... 
     p.resolve(result); 
    }); 
} 

甚至:

async function doStuff() { 
    //stuff... 
    $.get('http://some/url/...', function(result) { 
     // stuff... 
     async.resolve(result); 
    }); 
} 

這樣你不需要直接訪問Promises API,這使得你的代碼完全專注於任務,而沒有任何其他。

+1

我在想你錯過了'async' /'await'這一點。你可以產生一個場景,只需要執行'result = await $ .get(someUrl); doStuffWith(結果)'是不夠的?該提案的重點不在於處理回調。 – Amadan

+0

我只是想,如果你是在已經承諾爲什麼你需要創建另一個。 Bergi下面的回答很清楚 - 號碼=) – rokstar

回答

11

是否有可能解決異步函數沒有return關鍵字

沒有辦法去呼叫到async function創建的承諾的引用,但確實存在是沒有必要訪問,要麼(順便說一句,你不能.resolve()承諾,你實際上需要訪問承諾的解決功能)。

async/await整點要與諾言和其他可敬的東西玩得很好。這個想法是,異步函數返回一個承諾,並且你不必promisify任何東西(但如果你真的必須,單獨做) - 事實上,$.get確實返回一個(jQuery)的承諾。所以,簡單地寫

async function doStuff() { 
    //stuff... 
    var result = await $.get('http://some/url/...'); 
    // stuff... 
    return value; 
} 

如果你真的有一個回調回吐功能,用一個簡單的

async function doStuff() { 
    // stuff… 
    return new Promise(function(resolve, reject) { 
     $.get({ 
      url: 'http://some/url/...', 
      success: resolve, 
      error: reject 
      // don't do other "stuff" in here 
     }); 
    }); 
} 
0

當你從返回功能的承諾是沒有必要的功能是異步,實際上它甚至是糟糕的,因爲你正在創造兩個承諾!

function doStuff() { 
    return new Promise(function(resolve, reject) { 
     $.get('http://some/url/...', result => resolve(result)); 
    }); 
} 

async function main() { 
    const result = await doStuff(); 
} 
相關問題