在Javascript承诺中包装同步代码有什么好处吗?

时间:2016-04-20 06:34:38

标签: javascript multithreading promise

我理解promises可以更容易地使用异步代码而不是使用回调函数,但我不太清楚将它们用于纯同步代码的优势。

假设我有一个执行昂贵计算的函数需要5秒才能完成(不是异步,只是纯计算)。因为promises将在与单个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秒,这表明它们都在运行并行,但也在同一个线程上。

1 个答案:

答案 0 :(得分:0)

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

  

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

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

将来不会完成同步代码。

如果要执行“昂贵的功能”异步而不是主线程,您可能需要查看“网络工作者”。将promises与web worker结合使用是件好事。