JS承诺:此承诺等同于此异步/等待版本吗?

问题描述 投票:0回答:1

如果我有以下代码

new Promise(res => res(1))
.then(val => console.log(val))

等于

let val = await new Promise(res => res(1))
console.log(val)

我知道一个区别是我必须将第二个包裹在一个异步函数中,否则它们等效吗?

javascript asynchronous promise async-await es6-promise
1个回答
0
投票

因为您的诺言总是会解决(绝不会拒绝),所以它们是等效的。您也可以这样做:

Promise.resolve(1).then(val => console.log(val));

[请记住,与await的主要区别(除了需要包装在async函数中)是承诺被拒绝时发生的事情。尽管您的示例很难解决,而不是拒绝,但让我们看一下实际错误处理(您应该始终拥有)的外观:

new Promise(res => res(1))
   .then(val => console.log(val))
   .catch(err => console.log(err));

和:

try {
    let val = await new Promise(res => res(1));
    console.log(val);
} catch(e) {
    console.log(err);
}

或者,如果您没有try / catch,那么任何拒绝都会自动发送到由async函数自动返回的promise。错误的自动传播(同步异常和异步拒绝)在async函数中非常有用。

当您有多个异步操作序列时,就会更加明显:

const fsp = require('fs')。promises;]​​>

async function someFunc() {
    let handle = await fsp.open("myFile.txt", "w");
    try {
         await handle.write(...);
         await handle.write(...);
    } finally {
        handle.close();
    }
}

someFunc().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

这里,async包装器从三个await语句中的任何一个捕获错误,并将所有错误自动返回给调用者。 finally语句捕获最后两个错误之一以关闭文件句柄,但让错误继续传播回调用者。

© www.soinside.com 2019 - 2024. All rights reserved.