例如,有一个图片数组{pic1,pic2,pic3,pic4,pic5},开多个线程把他们传到服务器上,但是返回的时候(假设返回{result1,result4,result3,result2,result5})是乱序的。如何保持12345,也就是上传时的顺序?
android:1。是直接先new了一个list数据就直接按序号使用list的set方法,2.还使用过多线程的join方法或者wait方法可以实现效果,但是这样一个线程等着一个线程效率可能不太好,
求好点的实现方法
javascript:不太清楚怎么做,求解答
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
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/...
这里有一个简单的思路,任何语言都可以使用的方案。
可以先生成一个数组,直接用空字符串填充即可。
上传图片需要一个单独的方法,接收两个参数:图片+编号。
上传成功后,把返回数据替换数组对应的位置即可
你需要改成同步处理
哦,javascript 有 Promise.all 可以。
上传结果的时刻影响最大的是上传的时间, 这个是我们不能控制的, 所以如果是异步上传, 上传结果的返回(http的请求结束)顺序并没有办法可以确定的, 因为你不知道各个图片上传所需要的时间.
如果你想得到的是上传结果按顺序那只能通过同步上传, 即前一个图片上传结束之后再开始上传第二个图片. 不过一般不会是这种情况, 一般情况下说"返回"是指请求结果返回后回调接口.
而回调顺序的控制就是一堆逻辑判断了, 假设现在你同时发起AB两个请求, 希望回调的顺序也是AB对应的接口;
关键就是当B请求比A先返回时怎么处理, 基本逻辑就是查询A是否已经返回, 如果未返回就不回调, 等待A请求结束
, 然后A请求结束之后判断B是否已经返回, 如果未返回就直接回调A接口, 如果B已经返回, 因为之前B返回的时候没有回调接口, 所以这时A请求结束后需要按顺序回调AB接口.
多个请求的情况可以类推吧.
用时间或时间戳命名,返回时进行一个排序即可
用
Promise.all处理并发很方便: