使用$ .when()。done()等待下载完成

时间:2016-02-21 20:17:48

标签: jquery

我想下载多个json文件并将数据压缩到cookie。首先,我将它们保存到数组中,然后使用JSON.stringify()来压缩它。

我试过了:

var files = [];
$.when(
    ['file1', 'file2', 'file3'].forEach(function (f) {
        $.getJSON('/scripts/json/' + f + '.json', function (data) {
            files.push(data);
            console.log(files) // checking ok
        })
    })
).done(
    console.log(files); // Oops... this line will be excuted before $.when()
    $.cookie('files', JSON.stringify(files)) // compress before saving
)

正如您所看到的,jquery编译器无法确切知道文件下载完成的时间。

所以,我的问题是:如何wait他们?

1 个答案:

答案 0 :(得分:1)

您在$.when内进行了迭代,但是您没有将延期传递回来,因此$.when仅接收Array.forEach返回的结果,undefined始终为$.when(undefined).done(); ,基本上你正在做的是

$.when

如果您使用apply,则可以数组传递给map(),并使用forEach()代替$.when.apply($, ['file1', 'file2', 'file3'].map(function (f) { return $.getJSON('/scripts/json/' + f + '.json'); }) ).then(function() { var files = [].slice.call(arguments).map(function(x) { return x[0]; }); $.cookie('files', JSON.stringify(files)) // compress before saving }, function(err) { // failed }); 进行映射将返回Deferreds数组

lattice = np.array([[1,  0, -1,  0],
                    [0,  1,  0, -1],
                    [1,  0,  1,  0],
                    [0,  1,  0, -1]])