我对Promises很熟悉,但继承了一些非常不寻常的代码,而不是让new Promise()
使用构造函数的方法:
Promise.resolve().then(
function() {
// Do useful things
}
)
从我的研究中,这是一个weird version of setImmediate - 即,在下一个刻度线上运行以下函数。
await
版本的内容是什么?
答案 0 :(得分:8)
Promise.resolve()
可能有两个不同的原因。你碰到了其中一个:
这里显而易见的答案是await Promise.resolve();
。
await undefined
隐含地做同样的事情,但为什么不明确?
Promise.resolve()
经常出现在单一错误处理的承诺链的头部:
const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));
Promise.resolve()
.then(() => doSomething(""())) // bug!
.then(() => doSomething("else"))
.catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function

没有它,第一步可能会引发异常,这可能是意外的!
const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));
doSomething(""()) // bug!
.then(() => doSomething("else"))
.catch(e => console.log("Got " + e)); // uncaught!

答案是,您不再需要使用async / await进行Promise.resolve()
序言。
async
函数隐式捕获同步异常并返回被拒绝的promise,保证单一错误处理和promise返回值:
const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));
(async () => {
await doSomething(""()); // bug!
await doSomething("else");
})().catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function

这不仅是一个很好的不变量而且输入更少,与Promise.resolve()
kludge不同,它实际上仍然同步调用doSomething
:
function doSomething() {
console.log("doSomething() called");
""() // bug!
return new Promise(r => setTimeout(() => r(x), 1000));
}
(async () => {
await doSomething();
await doSomething("else");
})().catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function
console.log("here");

任何其他方式都很难实现。 async / await的另一个原因很棒!
答案 1 :(得分:4)
我继承了一些非常不寻常的代码,而不是让
new Promise()
使用Promise.resolve().then(…)
。根据我的研究,这是setImmediate的一个奇怪的版本 - 即,在下一个刻度上运行以下函数。
这是副作用,但可能不是此构造的预期目的。重点是"有用的代码"在then
回调中throw
- 安全且可以轻松地return
普通价值和承诺,启动通常的承诺链。它 也可以用new Promise
编写,但这需要使用resolve
来代替通常的return
。
这个版本的
await
是什么?
从字面上看,await Promise.resolve();
(可以缩短为等效的await;
语句)。但是,如果仅出于错误处理的目的(很可能),只需省略它。 async function
默认情况下会将异常转换为拒绝。
答案 2 :(得分:2)
只需await
。
如果你给await
一个不是诺言的表达,它的行为就像
await Promise.resolve(<nonPromiseExpression>)
因此await undefined
将导致异步函数的其余部分异步执行。以setImmediate
的这两个实现为例:
var setImmediate = function (fn) {
Promise.resolve().then(fn);
};
console.log('A');
setImmediate(function () {
console.log('E');
});
console.log('B');
setImmediate = async function (fn) {
await undefined;
fn();
};
console.log('C');
setImmediate(function () {
console.log('F');
});
console.log('D');
&#13;