如何使用从ajax调用返回的数据填充数组?

时间:2012-11-20 02:57:19

标签: ajax jquery

我正在调用应用程序来获取数据(路由),然后循环遍历该数据以获取有关每条路径的其他数据。最终数据将显示在console.log中没有问题,但我无法将其放入数组中。

$.getJSON('http://example-app/api/routes/?callback=?', function(data) {
            var routes = [];

            $(data).each(function(i){
                routes.push(data[i]._id);
            });

            function getRouteData(route, callback) {
                $.ajax({
                    url: 'http://example-app/api/routes/'+route+'?callback=?',
                    dataType: 'json',
                    success: function(data) {
                        callback(data);
                    }
                });
            }

            var route_data = [];

            $(routes).each(function(i) {
                getRouteData(routes[i], function(data) {
                    console.log(data); // this shows me the 13 objects
                    route_data.push(data);
                });
            });

            console.log(route_data); // this is empty

        });

1 个答案:

答案 0 :(得分:0)

nnnnnn是的,你必须使用Deferreds / promises来确保在将route_data发送到控制台之前填充$.when()

如何做到这一点并不是很明显,特别是$.getJSON('http://example-app/api/routes/?callback=?', function(data) { var route_promises = []; var route_data = []; function getRouteData(route) { var dfrd = $.Deferred(); $.ajax({ url: 'http://example-app/api/routes/'+route+'?callback=?', dataType: 'json' }).done(function(data) { //console.log(data); // this shows me the 13 objects route_data.push(data); }).fail(function() { route_data.push("ajax error"); }).then(function() { dfrd.resolve(); }); return dfrd.promise();//By returning a promise derived from a Deferred that is fully under our control (as opposed to the $.ajax method's jqXHR object), we can guarantee resolution even if the ajax fails. Thus any number of ajax failures will not cause the whole route_promises collection to fail. } $(data).each(function(i, route) { route_promises.push( getRouteData(route) ); }); //$.when doesn't accept an array, but we should be able to use $.when.apply($, ...), where the first parameter, `$`, is arbitrary. $.when.apply($, route_promises).done(function() { console.log(route_data); }); }); 接受一系列离散参数而不是数组这一事实。

另一个问题是,任何个人的ajax失败都不应该破坏整个企业。如何克服这一点可能不太明显。

我不是百分之百确定,但以下几行应该有效:

{{1}}

未测试

请参阅代码中的注释。