rok*_*tar 11 javascript asynchronous async-await ecmascript-2017
我开始使用ES7功能async/await,它提供了处理异步任务的最佳方法,并使您的代码更清晰,更易读.
但是,它不会让您访问由异步函数创建的Promise,因此如果您在异步函数中执行了一些异步请求,则应该对其进行promisify,然后等待它然后返回结果.我是说这个:
async function doStuff() {
//stuff...
var value = await new Promise(function(resolve) {
$.get('http://some/url/...', function(result) {
// stuff...
resolve(result);
});
});
return value;
}
Run Code Online (Sandbox Code Playgroud)
如果你能找到一个指向函数创建的Promise的指针,那么你的代码可能如下所示:
async function doStuff() {
//stuff...
var p = arguments.callee.promise;
$.get('http://some/url/...', function(result) {
// stuff...
p.resolve(result);
});
}
Run Code Online (Sandbox Code Playgroud)
甚至:
async function doStuff() {
//stuff...
$.get('http://some/url/...', function(result) {
// stuff...
async.resolve(result);
});
}
Run Code Online (Sandbox Code Playgroud)
这样您就不需要直接访问Promises API,这使得您的代码完全专注于任务而不需要任何其他功能.
Ber*_*rgi 15
是否可以在没有return关键字的情况下解析异步函数
没有.
没有办法获得对async function创建调用的承诺的引用,但实际上也没有必要访问它(顺便说一句,你不能.resolve()承诺,你实际上需要访问promise的解析函数).
整点async/ await是发挥好与承诺等thenables.我们的想法是,每个异步函数都会返回一个promise,而且你不需要宣传任何东西(但如果你真的必须这样做,请单独进行) - 事实上,$.get 它确实会返回一个(jQuery)的承诺.所以简单地写
async function doStuff() {
//stuff...
var result = await $.get('http://some/url/...');
// stuff...
return someValue;
}
Run Code Online (Sandbox Code Playgroud)
如果你真的有一个回调功能,请使用简单的
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
});
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14316 次 |
| 最近记录: |