返回具有延迟

时间:2017-02-21 16:19:04

标签: javascript jquery arrays ajax

我正在努力获得一系列"记录"每个包含一个"字段对象数组" (每个都有属性.name,.value和.fid)。

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

我希望能够稍后使用其他代码迭代这些代码,但是,目前,我正试图获得最终的数组数组。

我说实话,我正在努力解决如何用承诺做到这一点......

如果我同步这样做,我会使用FOR TO循环并将每次迭代推送到一个数组中,但异步会导致我出现问题...

我目前的代码如下。这将返回单个字段数组,而不是数组数组。我想我需要推动每一个“这个阵营”。到另一个数组。谁愿意帮忙?:

注意:

ridList是一个简单的DB记录ID数组,例如:[" 391"," 392"," 393"," 394&#34 ;," 395"," 398"," 399"," 400"," 396",&#34 ; 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();
};

2 个答案:

答案 0 :(得分:0)

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

  

我想我需要将每个'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();

答案 1 :(得分:0)

您可以创建一个数组,该数组在迭代调用时填充,并在执行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();
};