我理解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秒,这表明它们都在运行并行,但也在同一个线程上。
答案 0 :(得分:0)
Promised旨在帮助您管理异步代码,因此 - 至少据我所知 - 在用于同步处理时没有任何优势。此外,promise本身不是异步的,因此promise中的同步代码仍将执行同步。 在这种情况下,还要看一下“文档”的第一句话:
Promise对象用于延迟和异步计算。 承诺代表尚未完成的操作,但是 预计在未来。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
将来不会完成同步代码。
如果要执行“昂贵的功能”异步而不是主线程,您可能需要查看“网络工作者”。将promises与web worker结合使用是件好事。