Promise 简介
Promise 是一种处理异步操作的方式,可以将异步的回调函数转化为链式调用方式,避免回调地狱的情况出现。在 ES6 中,Promise 就成为了原生支持的语法糖。而在 ES8 中,增加了 Promise.race() 方法,用来解决并发请求超时等问题,接下来我们就来详细讲解如何在 ES8 中使用 Promise.race() 方法。
Promise.race() 方法简介
Promise.race() 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。该方法返回一个新的 Promise 实例,只要其中任意一个实例先改变状态,新实例的状态就改变,改变后的状态和第一个实例的状态相同。也就是说,只要有一个实例率先改变状态,Promise.race() 的返回值的状态就跟着改变。Promise.race() 方法有以下几个特点:
- 参数是一个数组,而且数组里面的元素只能是 Promise 实例;
- 返回值是一个 Promise 实例,该实例的状态由第一个改变状态的实例决定;
- 当参数为空数组时,返回的 Promise 实例永远处于等待状态;
Promise.race() 方法的使用场景
Promise.race() 方法主要用于解决并发请求的超时问题,在多个请求中,只要其中一个请求比其他请求耗时较长,就可以使用 Promise.race() 方法进行控制。当其中一个请求超时时,我们就可以取消其他请求,避免其继续浪费时间造成性能问题。下面我们来看具体的使用方式和示例代码。
使用 Promise.race() 实现并发请求超时
下面是一个简单的代码示例,用于实现一个异步函数的超时查询:
-- -------------------- ---- ------- -------- --------------- -------- - -- --------------- ----- -------------- - --- ----------------- ------- -- - ------------- -- - ---------- ----------------------- ------ -- --- -- -- ---------------------------- ------ ---------------------- ---------------- - ------------------------ ----- -- - -- ---------------- ----- ------------------- -------------- ----- -- - -- ----------- ----- ------------------ --
在这个示例中,我们定义了一个超时 Racing 的函数。它接受两个参数:超时时间和被加入的 Promise 异步函数。首先,它会创建一个新的 Promise ,在超时时间之后 reject 一个超时的错误。同时,在传入的被加入 Promise 任务动作里,我们通过 Promise.race() 来决定我们的内部两个 Promise 数组参数的完成状态的先后已经 Promise 是否超时。当我们 Promise 中任意需要完成的 Promise 任务或者到了超时时间,就会抛出对应的错误。
上述代码中主要使用了 Promise.race() 方法,该方法将多个 Promise 包装在一起,并返回一个 Promise 对象。只要有一个 Promise 对象的变化,整个 Promsie.race() 对象的状态就会变化,根据它的返回值,我们就可以完成超时查询的业务逻辑。
总结
Promise.race() 方法是一种十分便捷的控制异步任务的方式,在需要优化并发请求超时问题的场合下,能够大大简化代码量,提升代码的可读性。我们只需要将所有异步任务放到一个 Promise 数组中,然后调用 Promise.race() 方法,就能够解决并发请求的超时问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64953c2a48841e989427bc17