我想链接一个在循环中多次调用的异步ajax函数。为什么?因为这个功能是上传文件,但我希望它能连续上传文件,而不是一次上传所有文件。我不想使用async false,因为我希望在DOM上更新进度。
for (var i = 0; i < files.length; i++) {
var fd = new FormData();
fd.append('file', files[i]);
fd.append('galleryid', galleryid);
sendFileToServer(fd); //chain this function call
}
function sendFileToServer(formData)
{
var uploadURL ="includes/ajax/images/uploadImagePage.php"; //Upload URL
var extraData ={}; //Extra Data.
return jqXHR=$.ajax({
xhr: function() {
var xhrobj = $.ajaxSettings.xhr();
if (xhrobj.upload) {
xhrobj.upload.addEventListener('progress', function(event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
//Set progress
$('#uploadImageResponse').html(percent+'%');
}, false);
}
return xhrobj;
},
url: uploadURL,
type: "POST",
async:true,
contentType:false,
processData: false,
cache: false,
data: formData,
success: function(data){
status.setProgress('Upload completed. 100%.');
}
});
}
我不明白jquery延迟对象是如何工作的。
你可以试试这个。。。
function step1() {
updatePercentage();
$.ajax({ ... , // fill in these details
success: step2 }); }
function step2(data) {
updatePercentage();
$.ajax({ ... ,
success: step3 });
}
function step3(data) {
updatePercentage();
$.ajax({ ... ,
success: step4?? });
}
这可以被重构。不过我会把这个留给你:)
有许多不同的方法来序列化像这样的多个请求。这里有一种使用手动迭代而不是循环的的方法,所以只有在前一次迭代完成时,您才能前进到下一次迭代。
人工迭代
function sendAllFiles(files) {
var index = 0;
function next() {
var fd;
if (index < files.length) {
fd = new FormData();
fd.append('file', files[index]);
fd.append('galleryid', galleryid);
++index;
// send this file and when done, do the next iteration
sendFileToServer(fd).then(next);
} else {
// all files are done now
}
}
// start the first iteration
next();
}
使用
链接promise。减少()
下面是一个使用
.reduce()
和链式promise的不同设计模式:
files.reduce(function(p, item) {
return p.then(function() {
var fd = new FormData();
fd.append('file', item);
fd.append('galleryid', galleryid);
return sendFileToServer(fd);
});
}, $.Deferred().resolve()).then(function() {
// all files are done now
});
问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:
我被要求创建一个名为的对象,它可以链接函数和。 例如: 在此场景中,它首先打印早餐,等待3秒钟,打印午餐,然后在3秒钟后打印晚餐。 我试过这样的东西,但没用。我错过了什么?
问题内容: 我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前, for循环被循环。 我的代码: 搜索功能代码: 我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。 问题答案: 我将您的代码示例简化为以下几行,以使您更容易理解该概念。 先前代码的问题
问题内容: 我有以下代码: 是与Memcached数据库的连接。可以想象,回调函数是异步的,因此可以在for循环已结束时执行。同样,以这种方式调用时,它始终使用for循环的最后一个值。 我用这种方式尝试关闭 但是显然,这再次使用了for循环索引的最后一个值。 我也尝试在for循环之前声明一个函数,如下所示: 然后打电话 但同样没有成功,返回值始终是for循环的最后一个值。 谁能告诉我关闭有错吗?我
问题内容: 我在NodeJS中有一个forEach循环,遍历一系列键,然后从Redis异步检索其值。循环和检索完成后,我想返回该数据集作为响应。 我目前的问题是因为数据检索是异步的,发送响应时没有填充我的数组。 如何在我的forEach循环中使用promise或回调,以确保响应与数据一起发送? 问题答案: 我在这里使用Bluebird Promise 。请注意,代码的意图非常清晰并且没有嵌套。 首
问题内容: 事情是:我有一个页面,其中必须显示未确定数量的图像,这些页面是通过AJAX(在服务器端使用base64编码)一张一张地加载的。 问题是仅当获取所有图像时,才将图像(由renderImageData()函数构造)附加到所有DIV中(一起)。我的意思是,直到循环结束,才有可能进行任何DOM操作。 由于可能会有大量的图像,因此我需要一张一张地加载和显示图像,因此我无法将它们堆叠起来,直到将它