6

我有以下包含异步功能的节点应用程序,等待 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);
4

2 回答 2

1

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

在此提交中添加了支持regenerator,并且 Babel 升级为至少需要使用提交0.8.28发布 regenerator 。

于 2015-08-03T14:08:40.680 回答
0

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

于 2021-08-15T04:45:59.300 回答