Javascript Promise 函数的哪一部分是异步的?

Which part of the Javascript Promise function is asynchronous?

我正在学习 Javascript 异步编程和 Promise。我有以下代码。

let promiseTest = () => new Promise((resolve, reject) => {
console.log("Inside Promise");
resolve('Promise is resolved'); 
});

console.log("Before Promise"); 
promiseTest().then((data) => { console.log(data); });
console.log("After Promise");

我有函数“promiseTest”。我想异步执行。在现实世界中,它可能是一个获取 Web 服务或查询数据库的函数。我期望从代码中得到以下结果。

Before Promise
After Promise
Inside Promise
Promise is resolved

我原以为“console.log("Inside Promise")”会异步执行,因为它在 Promise 函数内部。但实际结果是

Before Promise
Inside Promise
After Promise
Promise is resolved

正如您所看到的实际结果,Inside Promise 是同步执行并阻塞主线程的。只有“resolve”里面的代码是异步的。也许,我目前对 javascript Promise 的理解是不正确的。如何修改我现有的代码以确保整个函数“promiseTest”在不阻塞主线程的情况下异步执行。

我建议对您的 promiseTest 函数使用 setTimeout,这会给您带来预期的结果。

setTimeout 设置一个计时器,一旦计时器到期就执行一个函数。

如您所见,“After Promise”将在“Promise is resolved”之前被记录,这完全是预料之中的,因为 promise 需要一些时间(在本例中为 1000 毫秒)来解决。

let promiseTest = () => new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log("Inside Promise"); 
        resolve('Promise is resolved');
    }, 1000) 
});

console.log("Before Promise"); 
promiseTest().then((data) => { console.log(data); });
console.log("After Promise");

执行器函数同步执行。 Promise 不会使任何代码异步;它只是一种在已经异步的事情完成时得到通知的机制。

如果你想进行 API 调用,那已经是异步的了,如果你使用 fetch API,那么你不需要 promise 构造函数,因为 fetch(...) 已经returns一个承诺。

Only the code inside "resolve" is asynchronous

在你的代码中,resolve()函数也被同步调用;只有promiseTest().then(..)的回调函数被异步调用。

How do I modify my existing code to make sure the whole function "promiseTest" is executed asynchronously without blocking the main thread.

您将不得不使用另一个 thread。即使你使用 setTimeout 延迟执行 promiseTest 函数,一旦它被压入调用堆栈,它也会同步执行。执行延迟的 promiseTest 函数时,不会执行任何其他操作。

如果延迟执行是您想要的,只需将 promiseTest 函数调用包装在 setTimeout.