在 Promise 的执行器函数中,代码是否开始异步执行?



当我们创建一个Promise时,执行函数被立即调用,但resolve回调函数是异步执行的。这意味着,如果我在executor函数内部做了一些繁重的工作,导致一个结果被传递给resolve回调,那么所有的工作都以阻塞的方式在同一个线程中执行,只有结果通过回调异步传递给我们。我希望这种理解是正确的。

executor函数中的异步部分是否仅在调用fetch或timeout等预定义的异步Web API时启动,或者在调用resolve或reject回调时启动?难道我们不能自己编写代码块,在并行线程中执行吗?

resolve回调是异步执行的回调。

你的意思可能是正确的,但措辞模棱两可。

不,resolve()可以同步或异步调用,这取决于执行器对它做什么。

new Promise(resolve => {
resolve(); // all synchronous
});
new Promise(resolve => {
setTimeout(resolve, 1000); // called later
});

resolve()调用立即返回,但它调度注册的承诺处理程序,如果有的话。

结果通过回调

异步传递给我们

是的。传递给.then()的回调函数总是异步执行,以便在不释放zalgo的情况下提供一致的输出顺序:

somePromise.then(() => console.log("second"));
console.log("first"); // no matter if `somePromise` is already fulfilled or not

是否只在调用预定义的异步Web API(如fetchtimeout)时才启动executor函数中的异步部分?

是的。

我们不能写自己的代码块在并行线程中执行吗?

的确,我们不能那样做。有些环境允许创建并行执行的工人,但它不是一个"代码块"。-它是一个单独的工作者,你必须通过事件与之通信。

创建Promise时,会立即调用executor函数但是resolve回调会被执行异步。这意味着如果我在里面做一些繁重的工作执行器函数产生的结果传递给解析回调,然后所有的工作都在同一个线程中执行以阻塞的方式,只有结果被传递给我们通过回调异步地。我希望这种理解是正确的。

是的

是否只启动executor函数中的异步部分当调用fetch或timeout等预定义的异步Web API时,或者何时调用resolve或reject回调?

是(但更多,下面)

我们不能自己编写代码块并并行执行吗的线程吗?

承诺不是用来实现多线程的。这可以使用Web Workers来实现。承诺只是为了在稍后的某个时刻调用回调函数。在特定的回调调用之前,可能有预定义的Web API函数(如setTimeoutfetch)在不同的线程中执行,但这在Promise中是不必要的。

请记住"asynchronous"不等于"in another thread"

PS:这是我对这个话题的理解(可能有缺陷)。如果我的答案有任何错误,请随意写一个新的答案。

最新更新