Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回延迟的对象数组数组_Javascript_Jquery_Arrays_Ajax - Fatal编程技术网

Javascript 返回延迟的对象数组数组

Javascript 返回延迟的对象数组数组,javascript,jquery,arrays,ajax,Javascript,Jquery,Arrays,Ajax,我试图获取一个“记录”数组,每个记录都包含一个“字段对象”数组(每个对象都有properties.name、.value和.fid) 每个记录数组都是通过API调用对数据库的AJAX调用获得的 我希望稍后能够使用其他代码迭代这些代码,但是,目前,我正在尝试获得数组的结果数组 老实说,我正在努力用承诺来做到这一点 如果我是同步的,我会使用FOR循环并将每个迭代推送到一个数组中,但是异步会给我带来问题 我目前的代码如下。这将返回单个字段数组,而不是数组数组。我想我需要将每个“thisArray”推送

我试图获取一个“记录”数组,每个记录都包含一个“字段对象”数组(每个对象都有properties.name、.value和.fid)

每个记录数组都是通过API调用对数据库的AJAX调用获得的

我希望稍后能够使用其他代码迭代这些代码,但是,目前,我正在尝试获得数组的结果数组

老实说,我正在努力用承诺来做到这一点

如果我是同步的,我会使用FOR循环并将每个迭代推送到一个数组中,但是异步会给我带来问题

我目前的代码如下。这将返回单个字段数组,而不是数组数组。我想我需要将每个“thisArray”推送到另一个数组。有人愿意帮忙吗

注:

ridList是数据库记录ID的简单数组,例如:[“391”、“392”、“393”、“394”、“395”、“398”、“399”、“400”、“396”、“397”、“437”]

AVMI_db是AJAX调用从中获取数据的URL

///////////////////////////////////////////////////////////////
// Get record info for each array member
///////////////////////////////////////////////////////////////
function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db) {
    var promises = [];

    $.each(ridList, function (index,value) {
        var def = new $.Deferred();
        var thisArray = [];
        $.get(AVMI_db, {   //******* ITERATIVE AJAX CALL ******* 
            act: 'API_GetRecordInfo', 
            rid: value
        }).then(function(xml2) {
            $(xml2).find('field').each(function() {
                var $field = {};
                $field.fid = $(this).find('fid').text();
                $field.name = $(this).find('name').text();
                $field.value = $(this).find('value').text();
                thisArray.push($field);
            });
            def.resolve(thisArray);
        });
        promises.push(def);    
    });    

    return $.when.apply(undefined, promises).promise();
};

也许我在这里遗漏了什么,如果我不明白你想要什么,请随时发表评论。我猜你想得到一个数组而不是一个字段数组。为此,您在自己的问题中给出了答案:

我想我需要将每个“thisArray”推送到另一个数组

但让我困惑的是,让我觉得我可能误解了一些东西,就是如果你能做一些像这样复杂的代码,我想你可以做一个简单的改变(或者你在什么地方得到了这个代码?),但无论如何。。。 我无法对此进行测试,因为我必须创建整个API调用,但它应该非常简单:

///////////////////////////////////////////////////////////////
// Get record info for each array member
///////////////////////////////////////////////////////////////
function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db) {
    var promises = [];

    $.each(ridList, function (index,value) {
        var def = new $.Deferred();
        var thisArray = [];
        $.get(AVMI_db, {   //******* ITERATIVE AJAX CALL ******* 
            act: 'API_GetRecordInfo', 
            rid: value
        }).then(function(xml2) {
            $(xml2).find('field').each(function() {
                var $field = [];
                $field.push($(this).find('fid').text());
                $field.push($(this).find('name').text());
                $field.push($(this).find('value').text());
                thisArray.push($fields);
            });
            def.resolve(thisArray);
        });
        promises.push(def);    
    });    

    return $.when.apply(undefined, promises).promise();

您可以创建一个数组,在迭代调用时从中填充该数组,并在承诺执行后返回该数组

function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db) {
var promises = [];
var returnValue = []; // to be returned by the promise
$.each(ridList, function (index,value) {
    var def = new $.Deferred();
    var thisArray = [];
    $.get(AVMI_db, {   //******* ITERATIVE AJAX CALL ******* 
        act: 'API_GetRecordInfo', 
        rid: value
    }).then(function(xml2) {
        $(xml2).find('field').each(function() {
            var $field = {};
            $field.fid = $(this).find('fid').text();
            $field.name = $(this).find('name').text();
            $field.value = $(this).find('value').text();
            thisArray.push($field);
        });
        returnValue.push(thisArray);
        def.resolve(thisArray);
    });
    promises.push(def);    
});    

return $.when.apply(undefined, promises).then(function() { 
  return returnValue; 
}).promise();
};

不是通常的重复,但是你可以在这里找到你的答案,因为这里有很多关于承诺和延迟的信息:谢谢Nelson。我不想引用我想要的,但我感谢你的帮助!事实上,这很简单,但是,出于某种原因,我就是看不到…@DavidStewart,不客气。如果答案有帮助,请投票。谢谢:)谢谢,我基本上就是这么做的。出于某种原因,我的想法遇到了障碍。非常感谢。。。!