用Javascript承诺包装同步代码有什么好处吗

Are there any advantages to wrapping synchronous code in a Javascript promise?

本文关键字:什么 代码 Javascript 承诺 包装 同步      更新时间:2023-09-26

我知道promise可以更容易地使用异步代码,而不是使用回调函数,但我不太清楚将它们用于纯同步代码的好处。

假设我有一个函数,它执行一个耗时5秒的昂贵计算(不是异步的,只是纯计算)。因为promise将在与单个JS线程相同的线程上运行,这样做有什么好处吗:

expensiveFunction() {
  // expensive function that takes 5 seconds to complete
}
expensiveFunction();
doSomethingAfterwards();

而不是这个:

expensiveFunctionPromise() {
  return new Promise(function(resolve) {
    // expensive function that takes 5 seconds to complete
    resolve();
  }
}
expensiveFunction().then(doSomethingAfterwards);

编辑:我制作了一个jsfiddle,似乎两者没有区别:

https://jsfiddle.net/nu1wj681/

同步版本每个循环大约需要3秒,总共6秒,而promise/async版本每个循环需要6秒,但总时间仍然是6秒,这表明它们都是并行运行的,但也在同一个线程上运行。

Promised旨在帮助您管理异步代码,因此——至少据我所知——在用于同步处理时没有任何优势。此外,promise本身不是异步的,因此promise中的同步代码仍将同步执行。在这种情况下,还可以看看"文档"的第一句话:

Promise对象用于延迟和异步计算。Promise表示尚未完成的操作,但预期在未来。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

同步代码在未来不会完成。

如果你想异步而不是在主线程上执行"昂贵的函数",你可能需要看看"web工作者"。将promise与web工作者结合使用是一件好事。