微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

等待 .each() 中的追加数据完成

如何解决等待 .each() 中的追加数据完成

我有一组输入和图像:

enter image description here

我正在遍历 divs获取名称和照片:

$('.subCats').each(function () {
    let id   = genRandomstr(),name = $(this).find('input.subCatName').val();

    if (name.length > 0) {
        dataObj['subCats'].push({
            'id'   : id,'name' : $(this).find('input.subCatName').val()
        });

        $(this).find('.media-list img').each(function () {
            if ($(this).data('stored') === false)
                urlToFile($(this).attr('src'),$(this).attr('title'),'image')
                    .then(function (file) {
                        data.append('subCatsPhotos[' + id + ']',file);
                });
        });
    }

});

我刚收到一个 AJAX 请求,但问题是在图像被附加到 FormData 之前请求正在执行。

这是将图像转换为文件对象的代码

function urlToFile(url,filename,mimeType) {
    return (fetch(url)
        .then(function(res){return res.arrayBuffer();})
        .then(function(buf){return new File([buf],{type:mimeType});})
);

}

我已经查看了 these solutions,但我正在努力使它们适应我的代码

解决方法

您可以跟踪发生了多少次追加:

let appended = 0;
const elements = [1,2,3,4,5];
elements.forEach(element => {
    // Do whatever with element
    // Using setTimeout to emulate .then()
    setTimeout(() => {
        console.log('Appended',element,'at',Date.now());
        if (++appended === elements.length) {
            console.log('Appended all!');
            // Do your AJAX request
        }
    },100 * Math.random());
});

或者,如果您可以使用 .map 而不是 .each:

const elements = [5,8,7,5,4];
const promise = Promise.all(elements.map(element => {
    // Some promise
    return new Promise(r => setTimeout(() => {
        console.log('Appended',Date.now());
        r();
    },Math.random() * 100));
}));
promise.then(() => {
    console.log('Appended all!');
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。