当前位置: 首页 > 知识库问答 >
问题:

如何在循环中链接异步ajax函数

齐俊达
2023-03-14

我想链接一个在循环中多次调用的异步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延迟对象是如何工作的。

共有2个答案

潘意
2023-03-14

你可以试试这个。。。

function step1() { 
       updatePercentage(); 
       $.ajax({ ... , // fill in these details
                  success: step2 }); }
function step2(data) { 
      updatePercentage(); 
       $.ajax({ ... ,
                success: step3 });
}
function step3(data) { 
       updatePercentage(); 
       $.ajax({ ... ,
                success: step4?? });
}

这可以被重构。不过我会把这个留给你:)

尚声
2023-03-14

有许多不同的方法来序列化像这样的多个请求。这里有一种使用手动迭代而不是循环的的方法,所以只有在前一次迭代完成时,您才能前进到下一次迭代。

人工迭代

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操作。 由于可能会有大量的图像,因此我需要一张一张地加载和显示图像,因此我无法将它们堆叠起来,直到将它