为什么不?没有理由,只是没有完成。
在2017年,它 在ES2017中完成:async
函数可以用于await
等待,无阻塞地等待承诺的结果。如果getSomething
返回promise(请注意await
)并且位于async
函数内部,则可以这样编写代码:
try
{
var foo = await getSomething();
var bar = doSomething(foo);
console.log(bar);
}
catch (error)
{
console.error(error);
}
(我曾假设您只打算getSomething
异步,但两者都可能是异步的。)
实时示例(需要最新的浏览器,例如最新的Chrome):
function getSomething() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.5) {
reject(new Error("Failed"));
} else {
resolve(Math.floor(Math.random() * 100));
}
}, 200);
});
}
function doSomething(x) {
return x * 2;
}
(async () => {
try
{
var foo = await getSomething();
console.log("foo:", foo);
var bar = doSomething(foo);
console.log("bar:", bar);
}
catch (error)
{
console.error(error);
}
})();
The first promise fails half the time, so click Run repeatedly to see both failure and success.
您已用NodeJS标记了您的问题。如果将Node API包装在Promise中(例如,使用promisify),则可以编写异步运行的漂亮的直接同步代码。