看这个网页:https://www.kancloud.cn/kancl...
说是Promise.race 在第一个promise对象变为Fulfilled之后,并不会取消其他promise对象的执行。
但是在下面的代码中,需要在web上显示所有的platform当前状态是在线还是离线,对platformList中的每个platform构建一个promise,在promise里面进行一次ajax api调用,实际调试环境中,数组有两个元素,一个会api成功(resolve ok),另一个会失败(resolve not ok),,运行时发现then只运行了一次,只打印了一次Promise.race race get result就没有反应了,第二次ajax打印了“resolve not ok”之后,没有再调用then中的回调函数:
var i
var promiseArray = []
const self = this
for (i in self.platformList) {
var p = new Promise(function(resolve, reject) {
apiGetPlatformIsOnline(self.platformList[i].id)
.then(response => {
console.log("resolve ok")
resolve(response.data)
})
.catch((err) => {
console.log("resolve not ok")
resolve(response.data)
})
});
promiseArray.push(p)
}
Promise.race(promiseArray).then(function(results) {
console.log("Promise.race race get result:", results)
}).catch(function(results) {
console.log("catch error,results", results);
});
据说用ajax同步或ajax递归能解决问题,就想问问,这种场合到底还能不能用promise了?一些指标监控类的页面经常遇到这种情况,初始化时并发地撒出一大把异步的api查询请求,然后回复一个就处理一个,成功了显示查询结果,失败了就显示一个问号
Promise.race
在第一个promise
对象变为Fulfilled
之后,并不会取消其他promise
对象的执行。只是只有先完成的Promise
才会被Promise.race后面的then
处理。其它的Promise还是在执行
的,只不过是不会进入
到promise.race
后面的then
内。Promise.all
和Promise.race
都是有使用场景的。有些时候我们做一个操作可能得
同时
需要不同的接口返回的数据,这时我们就可以使用Promise.all
;有时我们比如说有好几个服务器的好几个接口都提供
同样的服务
,我们不知道哪个接口更快,就可以使用Promise.race
,哪个接口的数据先回来我们就用哪个接口的数据。看你这个需求,这几个请求
完全没有关系
,所以就创建n个promise
,然后在各自的回调里面做各自的事情不行吗?Update2:
感觉好像没有必要用promise。
Update3:
在for循环里面使用let来声明i,就可以在then和catch里面使用i来分辨是哪个请求了。