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

Posted

技术标签:

【中文标题】是否可以在没有返回关键字的情况下解析异步函数【英文标题】:Is it possible to resolve async function without return keyword 【发布时间】:2017-03-22 19:04:36 【问题描述】:

我开始使用 ES7 功能 async/await ,它提供了处理异步任务的最佳方法,并使您的代码更清晰易读。

但是,它不会让您访问由 async 函数创建的 Promise,因此如果您在 async 函数中执行一些异步请求,您应该承诺它,然后等待它,然后返回结果。我的意思是:

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

【问题讨论】:

我认为您错过了async/await 的重点。你能产生一个场景,仅仅做result = await $.get(someUrl); doStuffWith(result) 是不够的吗?该提案的重点是不必处理回调。 我只是想如果你已经承诺了,为什么你需要创建另一个。下面的Bergi明确回应了 - 没有。=) 如果您碰巧来到这里获取您的古怪代码,请考虑这一点:***.com/questions/26150232/…。 【参考方案1】:

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

没有。

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

async/await 的全部意义在于与 promises 和其他 thenables 配合得很好。这个想法是 every 异步函数返回一个承诺,你不必承诺任何东西(但如果你真的必须,单独做) - 事实上,$.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
        );
    );

【讨论】:

【参考方案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();

【讨论】:

【参考方案3】:

如何创建异步函数,然后在调用它们时使用 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; 
  )

【讨论】:

以上是关于是否可以在没有返回关键字的情况下解析异步函数的主要内容,如果未能解决你的问题,请参考以下文章

JS async和await关键字

如何在“react-dropzone”的“onDrop”中使用异步等待? (解析错误:不能在异步函数之外使用关键字'await')

函数的重载重写与隐藏

是否可以在没有 async/await 的情况下从 Promise 返回已解析的值?

超简单的Python教程系列——第14篇:异步

C# 使用多个异步方法