怎么在异步请求的情况下,发起的请求有序,返回的时候,数据顺序和请求顺序一样呢?

例如,有一个图片数组{pic1,pic2,pic3,pic4,pic5},开多个线程把他们传到服务器上,但是返回的时候(假设返回{result1,result4,result3,result2,result5})是乱序的。如何保持12345,也就是上传时的顺序?

android:1。是直接先new了一个list数据就直接按序号使用list的set方法,2.还使用过多线程的join方法或者wait方法可以实现效果,但是这样一个线程等着一个线程效率可能不太好,
求好点的实现方法

javascript:不太清楚怎么做,求解答

阅读 9.3k
8 个回答

JS是单线程的吧,你只能把请求扔到异步上。我之前也遇到过这个问题,后来做成了异步请求队列。

最简单粗暴的方法就是下一个请求应该写在上一个请求的callback里面。假如只是用callback但是写成递归的话,可读性也没什么问题,可以避免}}}}}}}的情况。

次好的方法是用promise的写法,写成链式操作,但是假如你的请求数是不确定的,那么也不可能写死操作链。最终也只能回归到递归这个用法。

最好的方法就是用es7 stage-3的async/await。async/await语法相当于把异步写成的同步语法,然而本质上他还是建立在promise基础上的异步操作。但是有个很蛋疼的问题是,babel只转换语法不转换api,因此你想用async/await,就要加上core-js相应的polyfill……

async/await语法的介绍详细可以看这篇文章:https://github.com/brunoyang/...

这里有一个简单的思路,任何语言都可以使用的方案。

  1. 可以先生成一个数组,直接用空字符串填充即可。

  2. 上传图片需要一个单独的方法,接收两个参数:图片+编号。

  3. 上传成功后,把返回数据替换数组对应的位置即可

你需要改成同步处理

哦,javascript 有 Promise.all 可以。

上传结果的时刻影响最大的是上传的时间, 这个是我们不能控制的, 所以如果是异步上传, 上传结果的返回(http的请求结束)顺序并没有办法可以确定的, 因为你不知道各个图片上传所需要的时间.
如果你想得到的是上传结果按顺序那只能通过同步上传, 即前一个图片上传结束之后再开始上传第二个图片. 不过一般不会是这种情况, 一般情况下说"返回"是指请求结果返回后回调接口.

而回调顺序的控制就是一堆逻辑判断了, 假设现在你同时发起AB两个请求, 希望回调的顺序也是AB对应的接口;
关键就是当B请求比A先返回时怎么处理, 基本逻辑就是查询A是否已经返回, 如果未返回就不回调, 等待A请求结束
, 然后A请求结束之后判断B是否已经返回, 如果未返回就直接回调A接口, 如果B已经返回, 因为之前B返回的时候没有回调接口, 所以这时A请求结束后需要按顺序回调AB接口.

多个请求的情况可以类推吧.

用时间或时间戳命名,返回时进行一个排序即可

Promise.all 处理并发很方便:

Promise.all([p1,p2,p3,p4...]).then(
    function([r1,r2,r3,r4...]){
        ...
    }
);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题