19

我开始使用 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,这使您的代码完全专注于任务,而没有其他任何东西。

4

3 回答 3

21

是否可以在没有返回关键字的情况下解析异步函数

不。

没有办法获得对调用async function创建的承诺的引用,但实际上也没有必要访问它(顺便说一句,你不能.resolve()承诺,你实际上需要访问承诺的解析功能)。

async/的全部意义在于await与 promises 和其他 thenables 配合得很好。这个想法是每个异步函数都返回一个承诺,并且您不必承诺任何事情(但如果您真的需要,请单独执行) - 事实上,$.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
        });
    });
}
于 2016-11-09T01:40:32.700 回答
2

当你从一个函数返回一个promise时,函数不需要是异步的,实际上它甚至更糟糕,因为你正在创建两个promise!

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

async function main() {
    const result = await doStuff();
}
于 2017-07-28T07:39:06.640 回答
-1

如何创建异步函数,然后在调用它们时使用 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; 
  })
于 2018-08-16T21:39:41.180 回答