承诺异步等待没有.then回调

时间:2017-09-12 09:36:34

标签: javascript asynchronous

我正在尝试学习并更好地了解承诺如何与新的async / await关键字一起使用,但有一件事令人困惑。

在本文中:https://davidwalsh.name/async-await

它说使用asyncawait并不需要使用回调,例如:

async function parallel(callback) {
    const wait1 = wait(500);
    const wait2 = wait(500);
    await wait1;
    await wait2;
    callback( [wait1, wait2] );
}

如果要测试它,我们需要首先定义一个用作wait的超时函数:

var wait = function(time) {

    return new Promise( function(resolve, reject) {

        setTimeout(function() {
            resolve( Math.random() * time );
        }, time);

    });

};

最后我们需要调用我们的parallel函数并读取值:

parallel(function(data) {
    console.log('data', data);
});

问题在于,如果您读取值 - 它们是承诺对象而不是实际值,为了解决这个问题,可以这样做:

async function parallel(callback) {
    var wait1 = wait(500).then(function(data) {
                    wait1 = data;
                });
    var wait2 = wait(500).then(function(data) {
                    wait2 = data;
                });
    await wait1;
    await wait2;
    callback( [wait1, wait2] );
}

现在它会起作用,在这里演示:https://jsfiddle.net/jp3g2q5k/

但是你能帮我理解为什么我必须使用.then回调吗?它假设是回调自由的情况。或者也许有人知道如何在没有回调的情况下改变此代码。

1 个答案:

答案 0 :(得分:1)

您正在通过等待'来解决承诺。关键词。在您的示例中:

const result1 = await wait1;
const result2 = await wait2;
callback( [result1 , result2 ] );