我开始使用ES7功能async/await
,它提供了处理异步任务的最佳方法,并使您的代码更清晰,更易读。
但是它不会让你访问由异步函数创建的Promise,所以如果你在异步函数中做了一些异步请求,你应该将它同化,然后等待它然后返回结果。我的意思是:
async function doStuff() {
//stuff...
var value = await new Promise(function(resolve) {
$.get('http://some/url/...', function(result) {
// stuff...
resolve(result);
});
});
return value;
}
如果您可以找到指向函数创建的Promise的指针,那么您的代码可能如下所示:
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,这使得您的代码完全专注于任务而不需要任何其他功能。
答案 0 :(得分:14)
是否可以在没有return关键字的情况下解析异步函数
没有
没有办法获得对async function
调用创建的承诺的引用,但实际上也没有必要访问它(顺便说一下,你不能.resolve()
一个承诺,你实际上需要访问promise的解析函数。
async
/ await
的全部意义在于与承诺和其他人一起玩得很好。我们的想法是每个异步函数都会返回一个承诺,并且你不需要宣传任何东西(但如果你真的必须这样做,请单独进行) - 事实上,$.get
返回(jQuery)承诺。所以简单地写一下
async function doStuff() {
//stuff...
var result = await $.get('http://some/url/...');
// stuff...
return someValue;
}
如果你真的有回调函数,请使用简单的
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
});
});
}
答案 1 :(得分:0)
当你从一个函数返回一个promise时,不需要该函数是异步的,实际上它甚至是坏的,因为你创造了两个承诺!
function doStuff() {
return new Promise(function(resolve, reject) {
$.get('http://some/url/...', result => resolve(result));
});
}
async function main() {
const result = await doStuff();
}
答案 2 :(得分:0)
如何创建异步函数,然后在调用它们时使用await。
//define
async promiseFunction(foo) {
return otherPromiseFunction(foo);
async promiseFunction2(foo) {
return '10';
}
async promiseFunction3(foo) {
return new Promise((resolve, reject) => {
resolve('foo')
})
}
//invoke
anotherPromiseFunction(bar).then(async foo => {
const fooResult = await promiseFunction(foo);
return fooResult;
})