【问题标题】:Unable to resolve promise when using async await with babel and ES6 promise使用带有 babel 和 ES6 承诺的异步等待时无法解决承诺
【发布时间】:2015-08-21 14:37:07
【问题描述】:

我有以下包含异步函数的节点应用程序,正在等待 ES6 承诺。

async function test(id){
    try {
        let val = await Promise.resolve(id);
        console.log("val: " + val);
    } catch (error) {
        console.log("error: " + error);
    }
}

test(1);

结果 = val: 未定义

预期结果:val:1

我使用 gulp-babel 将其编译为 ES5。

我在 gulp 任务中有以下设置:

.pipe(babel({ optional: ["es7.asyncFunctions"] }))

在 npm 安装 babel 之后,我还需要在 'babel/polyfill' 中。

转译代码:

function test(id) {
var val;
return regeneratorRuntime.async(function test$(context$1$0) {
    while (1) switch (context$1$0.prev = context$1$0.next) {
        case 0:
            context$1$0.prev = 0;
            context$1$0.next = 3;
            return Promise.resolve(id);

        case 3:
            val = context$1$0.sent;

            console.log('val: ' + val);
            context$1$0.next = 10;
            break;

        case 7:
            context$1$0.prev = 7;
            context$1$0.t0 = context$1$0['catch'](0);

            console.log('error: ' + context$1$0.t0);

        case 10:
        case 'end':
            return context$1$0.stop();
    }
}, null, this, [[0, 7]]);
}

test(1);

【问题讨论】:

  • 能否展示一下转译后的代码?
  • 嗯,看起来应该可以了。奇数。
  • 根据我的经验,将 try catch 语句与 promise 一起使用并不是一个好习惯。这就是为什么你有像 Promise.fail() 这样的 API 调用。但我不熟悉 Babel 如何处理 Promise,所以我可能是错的。
  • @tutiplain async/await 的优点之一是您应该能够使用 try/catch 。
  • 你使用的是最新版本的 Babel 吗?当我使用babel-node 运行它时,我得到val: 1

标签: javascript node.js async-await babeljs es6-promise


【解决方案1】:

您似乎在使用早于 Babel 版本 5.5.0 的 Babel 版本。在此版本之前,可以将regenerator(Babel 的依赖项)安装在低于0.8.28 的版本中,这是regenerator 开始支持await Promise.resolve(value)(您示例中的代码)的第一个版本。

regenerator 端的this 提交中添加了支持,并且Babel 升级为至少需要0.8.28 版本的再生器和this 提交。

【讨论】:

    【解决方案2】:

    我认为您必须等待测试功能。 因为测试函数 await 一个 Promise,所以当你在其他上下文中调用它时等待测试函数将帮助你等待它完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 2017-06-15
      • 1970-01-01
      • 2020-07-04
      • 2019-04-29
      • 2018-04-17
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多