ES9 中的 Promise.race 带来的思考
Promise.race 是 ES6 引入的,其作用是同时执行多个 Promise 对象,只要有一个 Promise 对象 resolved 或 rejected,race 就结束,返回第一个执行结束的 Promise 对象的结果。
在 ES9 中,Promise.race 得到了新的扩展,即支持传入可迭代对象(Iterable),而不仅限于数组。这意味着,我们可以使用无限的迭代器,例如生成器函数中的 yield 语句,实现更多的异步操作,从而更好地应对复杂的异步场景。
下面,我们将通过实例,对 ES9 中的 Promise.race 进行深入学习和思考。
实例说明:多个异步任务竞相完成
假设我们需要实现一个功能,即在 iOS 设备上拍照或录像时,同时获取设备方向传感器的数据。在获取到两者数据后,进行相应的处理。
首先,我们可以使用 Promise.race 实现任务同时执行的需求。代码如下:
------------------------------ ---------------------------- ------------------- ----------------- -- - -- ---- ---------- - --------------- ---- -- ------------ -- - -- ---- ---
其中,getCameraData 和 getOrientationSensorData 分别是获取相机数据和设备方向传感器数据的 Promise 对象。
在 Promise.race 后面的 then 方法中,我们可以获取到最先完成的 Promise 的结果,即最先获取到数据的 Promise 对象。在示例代码中,我们使用了数组解构语法,获取了两个 Promise 对象的结果。这里需要注意的是,如果 Promise.race 中的 Promise 对象有一个 rejected,则操作会跳到 catch 语句块。
实例说明:设定超时时间
在实际的开发中,我们可能会遇到需要在一定时间内获取异步操作的结果的场景。比如,对于一个请求,我们需要在 3 秒内获取到其结果,否则认为该请求失败。
正常情况下,我们可以使用 Promise 的 setTimeout 方法来实现超时操作。但是,ES9 中的 Promise.race 也可以用来实现该需求,代码如下:
-------------- ---------- --- ----------- ------- -- - ------------- -- ---------- --------------- ------ -- -- ---------- -- - -- ------- -- ------------ -- - -- ------- ---
在上述代码中,我们在 Promise.race 中传入了两个 Promise 对象。第一个 Promise 对象是 getData,即需要获取数据的异步操作。如果 getData 在 3 秒内返回了结果,则 Promise.race 的 then 方法会执行,否则将执行出现在 Promise.race 中的新 Promise 对象,并返回一个超时的错误信息。
需要注意的是,因为我们只需要在 3 秒内获取结果,所以第二个 Promise 对象可以不接受任何参数,只需在超时后调用 reject 方法即可。
总结
ES9 中的 Promise.race 扩展使其可以接受可迭代对象(Iterable)。这使得我们能够更好地应对复杂的异步场景,并在一定程度上实现超时功能。当然,除了 Promise.race,ES9 中还有其他有趣的 Promise 扩展,如 Promise.prototype.finally。在开发过程中,选择合适的 Promise 扩展可以帮助我们更好地处理异步操作,从而提升代码质量和开发效率。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/664bdd48d3423812e4ab80c3