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

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)