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

标签 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;
}

如果您能找到一个指向由函数创建的 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,这让你的代码完全专注于任务,没有任何其他。

最佳答案

Is it possible to resolve async function without return keyword

没有。

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

async/await 的全部要点是与 promise 和其他 thenable 一起玩得开心。这个想法是,每个 异步函数都返回一个 promise ,并且您不必 promise 任何东西(但如果您真的必须这样做,请单独进行)——事实上,$. get 确实 返回一个 (jQuery) promise。所以简单的写

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
        });
    });
}

关于javascript - 是否可以在没有 return 关键字的情况下解析异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499033/

相关文章:

javascript - 棘手的正则表达式捕获

javascript - NodeJS,MIME 类型 ('text/html' )不是受支持的样式表 MIME 类型

java - 从 javascript 调用的 applet 方法中的 return 语句

javascript - Intern JS - 测试定义之前的异步 Hook ?

c# - 启动异步方法时 Hook

c# - 由非托管应用托管的托管组件中的 Await 和 SynchronizationContext

javascript - 使用 D3 从 CSV 文件创建分层内容的有效方法

c# - 如果使用计时器控件,是否需要使用异步任务?

c# - 等待事件结束

c# - 包装一个使用基于事件的异步模式的库,用于 Async/Await