作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现文件(使用 XMLHttpRequest level2)顺序上传到服务器。获得了一堆附加了文件的 DOM 元素(FileAPI - W3C 草案)。我想按顺序上传(一个接着一个),但 XMLHttpRequest 是异步工作的。小代码示例:
$thumbnails = $('queue').find('.item');
for (var i = 0, len = thumbnails.length; i < len; i++) {
var xhr = new XMLHttpRequest();
xhr.upload.onload = function(ev){}; // fires on upload complete
var fd = new FormData
fd.append('Files['+i+']', $thumbnails[i].file) // insert atached File to FormData
xhr.open("POST", 'server_url', true) // last true means "use asynch rq"
xhr.send(fd)
}
此代码的问题是,FOR 循环在文件上传过程中独立迭代。因此开始更多并行上传:
即使之前的上传未完成,此设计也会创建新的 xhr 对象。但我仍然想保持上传的异步范例(没有浏览器阻止、进度事件等)。只是无法弄清楚如何等待当前上传完成然后开始新的上传周期。
有什么想法吗?
最佳答案
您可以创建堆栈并递归处理请求,也可以重用相同的请求对象。
我知道,它摇滚! :) 这是您的代码:
// last in, first out.
var stack = [];
$('queue').find('.item').each(function(i, el){
// insert atached File to FormData
var fd = new FormData();
fd.append('Files['+i+']', el.file);
stack.push(fd);
});
var xhr = new XMLHttpRequest();
(function recur() {
// fires on upload complete
xhr.upload.onload = function(ev) {
// do recursion until the stack is not empty
if (stack.length) recur();
};
// send an asynchronous POST request
xhr.open("POST", 'server_url', true);
xhr.send(stack.shift());
})();
关于javascript - 如何用异步代码实现顺序迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246533/
我是一名优秀的程序员,十分优秀!