使用babel和ES6 promise时,使用async await无法解决promise。

6

我有一个包含异步函数的节点应用程序,等待ES6 promise。

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

test(1);

结果 = val: undefined

期望的结果: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);

你可以展示一下转译后的代码吗? - Bergi
嗯,看起来应该可以工作。奇怪。 - Bergi
@tutiplain async/await 的一个优点是可以使用 try/catch 来处理异常。 - Matt Browne
我认为你应该等待一个 Promise 本身,而不是 Promise.resolve() 调用的结果。例如,如果你从使用 Promises 的某个库中获取了一个 Promise 的引用,比如 var promise = myLibrary.asyncMethod(),然后执行 let val = await promise,它应该可以工作。 - Matt Browne
1
你是否使用最新版本的 Babel?当我使用 babel-node 运行它时,会得到 val: 1 - Matt Browne
显示剩余3条评论
2个回答

1

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

this提交添加了对 regenerator 的支持,this提交使Babel升级以至少要求 0.8.28 版本的regenerator。


0

我认为你需要等待测试函数。 由于测试函数等待一个Promise,所以在其他上下文中调用它时等待测试函数将帮助你等待直到它完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接