【问题标题】:Why does the .done() method finish executing before the $getJSON calls finish executing?为什么 .done() 方法在 $getJSON 调用完成之前完成执行?
【发布时间】:2016-06-06 10:50:16
【问题描述】:

我遇到了一个问题,即我的方法之一在我的 getJSON 调用完成执行之前正在执行。此方法在执行自身之前需要调用中的数据。

我查看了一些东西,例如“延迟调用或 .done(),但我的主要问题是我的嵌套 getJSON 调用是可变的。这意味着从我的第一个文件中我得到一个数字,并使用该数字创建一个循环,然后根据该数字执行多个 getJSON 调用。我无法附加 .done(),因为我必须多次执行此操作,并且由于相同的原因,延迟调用不会起作用。出于某种原因,第一个 .done()不会等到内部 getJSON 调用完成后再执行……这应该发生吗?

       $.getJSON(file, function(d) 
    {

       for(var i = 0; i < d.name.length; i++)
       {
            files[i] = d.name[i];



                fileName = "/"+files[i];

           $.getJSON(fileName+'.PNG', function(data)
           {


                json[i] = data;
           });
       }
    })

   .done(function()
   {
    makeUL(plan); //doesn't work but needs the data from json[i] in order to continue.
    })

    .fail(function( jqxhr, textStatus, error )
    {
        var err = textStatus + ', ' + error;
        console.log( "Request Failed: " + err);
        alert("failed");
   });

有人知道我该怎么做吗?

谢谢大家:)

【问题讨论】:

    标签: javascript jquery html ajax json


    【解决方案1】:

    你可以尝试使用$.when(),它可以用来完成所有的promise

    $.getJSON(file, function (d) {
        var requests = $.map(d.name, function (value, i) {
            files[i] = value;
            var fileName = "/" + value;
            return $.getJSON(fileName + '.PEV', function (data) {
                json[i] = data;
            });
        });
    
        $.when.apply($, requests).done(function () {
            makeUL(plan);
        });
    }).fail(function (jqxhr, textStatus, error) {
        var err = textStatus + ', ' + error;
        console.log("Request Failed: " + err);
        alert("failed");
    });
    

    【讨论】:

    • 看来这行得通...你就是那个人...非常感谢!你能解释一下到底发生了什么吗?整个映射请求和 files[i]=value 没有循环只是做 $.when.apply 等......?谢谢看起来真的很方便,所以我想完全理解它,因为我是 Jquery 的新手 :)。
    • @Lasagna $.map(d.name, function(){}) 执行循环,它返回一个 jQuery ajax 承诺对象数组,当传递给$.when 时,如图所示将返回一个承诺对象,只有当所有传递给它的数组中存在的承诺已解决
    • 我想说谢谢你的回答,我忘了回来阅读它,因为我问这个时真的很累。看起来这是一个非常有用的功能:)
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多