gpt4 book ai didi

javascript - 等待相当于 'Promise.resolve().then()' ?

转载 作者:可可西里 更新时间:2023-11-01 02:04:57 25 4
gpt4 key购买 nike

我熟悉 Promises,但继承了一些相当不寻常的代码,而不是制作 new Promise(),而是使用以下代码:

Promise.resolve().then(
function() {
// Do useful things
}
)

根据我的研究,这是一个 weird version of setImmediate - 即,在下一次滴答时运行以下函数。

await 版本是什么?

最佳答案

Promise.resolve() 可能有两个不同的原因。你触及了其中之一:

延迟到 JS 事件循环的当前运行结束

这里显而易见的答案是 await Promise.resolve();

await undefined 隐含地做同样的事情,但为什么不显式呢?

奇异错误处理

Promise.resolve() 也经常出现在用于单一错误处理的 promise 链的头部:

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() 杂乱无章,它实际上仍然同步调用 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 很棒的另一个原因!

关于javascript - 等待相当于 'Promise.resolve().then()' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45079887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com