如果我有以下代码
new Promise(res => res(1))
.then(val => console.log(val))
等于
let val = await new Promise(res => res(1))
console.log(val)
我知道一个区别是我必须将第二个包裹在一个异步函数中,否则它们等效吗?
因为您的诺言总是会解决(绝不会拒绝),所以它们是等效的。您也可以这样做:
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
语句捕获最后两个错误之一以关闭文件句柄,但让错误继续传播回调用者。