【问题标题】:Babel async/await only returning the promiseBabel async/await 只返回承诺
【发布时间】:2016-01-24 13:43:43
【问题描述】:

我的问题是下面的代码示例只会返回 Promise 对象并且 async/await 根本不起作用。

import 'babel-polyfill';

function doAsync() {
    return new Promise(function(resolve, reject){
        setTimeout(function(){
            resolve('result')
        }, 2000)
    })
}

async function doStuff() {
    try {
        return await doAsync()
    } catch (err) {
        console.err(err);
    }
};

doStuff() // Returns the promise object
console.log('log') // Runs before timeout

Babel 配置

{
    presets: ["es2015"],
    plugins: [
      "transform-class-properties",
      "syntax-decorators",
      "transform-decorators-legacy",
      "syntax-async-functions",
      "transform-regenerator"
    ]
}

【问题讨论】:

  • “根本不起作用”是什么意思?我可能错了,但 AFAIK 异步函数返回承诺。
  • 这意味着 Babel 应该使用 regenerator 转换代码,等待 promise 得到解决。最后一个 console.log() 应该只在 promise 解决后运行(在 setTimeout 之后)
  • @wintercounter:你没有awaitdoStuff()。或者将你的日志语句放在await 之后的函数中(删除return),等待超时
  • @wintercounter:只有async functions 会被再生器转化。不会隐式等待对这些函数的调用;为什么会这样?
  • @bgoscinski 除非它在另一个 async 函数中否则不会:D

标签: javascript async-await ecmascript-6 babeljs


【解决方案1】:

doStuff 是一个异步 函数,它返回一个promise。您不是在等待承诺被履行或拒绝,而是立即登录到控制台。你观察到的行为是正确的。如果您只想在 promise 完成时登录到控制台,请将 then 调用链接到从 doStuff 返回的 promise。

【讨论】:

  • 明白了,我必须在等待之后的try语句中编写我的代码。
猜你喜欢
  • 2021-11-27
  • 2016-05-20
相关资源
最近更新 更多