10 回答
TA贡献1873条经验 获得超9个赞
Promise.all可以保证顺序但是得等到所有请求完毕才会触发
function p1(time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(time);
}, time);
})
}
Promise.all([p1(5000), p1(1000)]).then(function (res) {
console.log(res);//[5000,1000]
});
TA贡献1828条经验 获得超6个赞
一,可以把请求回来的数据做一个标识,然后把所有数据 都放到一个数组中,按标识 排序。
二,使用Promise.all,接收的是一个数组,等到数组中的请求全部完成,就执行Promise.all().then(values => {}),其中values就是一个数组,且排好序的
TA贡献1793条经验 获得超6个赞
万无一失的方法是:
从第一个开始执行,等第一个执行结束后,再执行第二个,依次类推。
这种同步方法效率太低。
那么可以考虑Promise.all呢?
担心promise.all中的所有task都是异步执行的?
那么真正返回结果是依task列表顺序返回,所以就它了。
TA贡献1909条经验 获得超7个赞
以下代码实现了:
并发请求
顺序操作
不需要等待全部请求完毕
可以直接运行
(()=>{
Promise.allInOrder = (promises, thenForEach)=>{
let sequence = Promise.resolve();
promises.forEach(function(request){
sequence = sequence.then(function(){
return request.then(thenForEach);
});
});
};
})();
// test
(()=>{
let timeConsumingFunc = param=>new Promise(
(resolve)=>{
let timeout = Math.random() * 5000;
console.log(`task ${param} will be resolved in ${timeout}ms`);
setTimeout(()=>{
console.log(`${param} resolved`);
resolve(param+10);
}, timeout);
}
);
Promise
.allInOrder(
[timeConsumingFunc(1), timeConsumingFunc(2), timeConsumingFunc(3)],
d=>{
return new Promise(function(resolve) {
console.log(d);
resolve();
});
}
)
})();
这是我以前的一个提问的最终解决方法,也可以采用我采纳的哪个答案,只是代码会臃肿一些
补充:
针对你说的情况,可以间隔1s内的鼠标点击作为一组请求用上面方法并发请求,间隔大于1s的同步继发操作
TA贡献2019条经验 获得超9个赞
其实如果后天和前台能够联动,最好是请求时有一个标号,然后返回时带标号,这样肯定没有问题,且无论多少返回都可以先展示,后期再依序调整。
其实如果更友好的,发一次请求,就在数组中填一个展位符信息,接收到一个就更新数组,并刷新展示。
TA贡献1890条经验 获得超9个赞
我的话可能会这么做:
function Ajax (option) {
this.list = []
let ajax = (data) => {
let i = arr.length
this.list[i] = '等待结果'
$.ajax(option.url, {
data:data
// ...
success: (res) => {
this.list[i] = res
option.success(res, i)
}
})
}
return ajax
}
let userAjax = new Ajax({url:xxx,method:xxx})
每次请求,直接userAjax(data),然后请求结果的顺序在list上固定好的,怎么响应影响不了
然后看你说响应里加字段,那就是后端控制了,你只需要对id进行排序,不过感觉跟你前面说的携带相关参数,响应中返回,本地做mapping关系来实现没什么区别啊,只不过一个前端生成uuid,一个后端生成uuid。
添加回答
举报