【问题标题】:How to run then() when all json data gone through the loop当所有 json 数据都经过循环时如何运行 then()
【发布时间】:2019-08-20 22:13:50
【问题描述】:

在我的代码中,我处理需要按顺序解析的多个 JSON 请求。

let allRadio_data, allHistory_data, iTunes_data;


$.when(parseRadioList())
  .then(function(list) {
    radioList_data = list;

    return $.when(
    parseEachRadioData(radioList_data), 
    ParseEachHistoryData(radioList_data)
    );

  })
  .then(function() {
    console.log(allRadio_data);
    console.log(allHistory_data);

    return $.when(_parseiTunes());
  })
  .then(function(iTunesInfo) {
    iTunes_data = iTunesInfo;

    return _cacheOptions();
  })

function _cacheOptions() {
  // FINAL function
}


/////////
function parseRadioList() {
  return $.getJSON("https://api.myjson.com/bins/xiyvr");
}

function _parseiTunes() {
  return $.getJSON("https://itunes.apple.com/search?term=jackson&limit=10&callback=?")
}

function parseEachRadioData(radioList) {
  allRadio_data = [];
  $.each(radioList, function(index, radio) {
    $.when($.getJSON(radio.url + "/stats?sid=" + radio.stream_id + "&json=1&callback=?"))
      .then(function(data) {
        allRadio_data.push(data);
      });
  })
}

function ParseEachHistoryData(radioList) {
  allHistory_data = [];
  $.each(radioList, function(index, radio) {
    $.when($.getJSON(radio.url + "/played?sid=" + radio.stream_id + "&type=json&callback=?"))
      .then(function(data) {
        allHistory_data.push(data);
      });
  })
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

现在代码正在运行,但是我在 console.log(allRadio_data); 执行的地方是空的。但是,如果我使用settimeout() 将其延迟一秒钟,则数据已完成。这意味着then() 没有按时运行。

这是我正在寻找的结构:

  1. JSON 文件 1 已解析。 parseRadioList()
  2. JSON1 是一个包含多个 JSON URL 条目的数组。
  3. 遍历 JSON1 数组中的 URL,并为每个 URL 执行 getJSONparseEachRadioData(radioList_data) & ParseEachHistoryData(radioList_data)
  4. 将每个 JSON 的数据推送到一个通用 Array 中。
  5. 一旦完成,解析 JSON2 _parseiTunes()

任何想法如何使此代码以正确的结构运行。

提前致谢。

【问题讨论】:

    标签: javascript jquery json promise getjson


    【解决方案1】:

    首先,parseEachRadioDataParseEachHistoryData 根本不返回任何东西,更不用说 Promise - 所以不可能等待它们

    另外,你过度使用 $.when ... 实际上你永远不需要使用它,只需使用常规 Promise,因为 jQuery $.getJSON 等返回一个可用的类似 Promise 的对象

    即你的代码可能是

    let allRadio_data, allHistory_data, iTunes_data;
    
    
    parseRadioList()
    .then(function(list) {
        radioList_data = list;
        return Promise.all([
            parseEachRadioData(radioList_data), 
            ParseEachHistoryData(radioList_data)
        ]);
    
    })
    .then(function(result) {
        allRadio_data = result[0];
        allHistory_data = result[1];
        console.log(allRadio_data);
        console.log(allHistory_data);
        return _parseiTunes();
    })
    .then(function(iTunesInfo) {
        iTunes_data = iTunesInfo;
        return _cacheOptions();
    })
    
    function _cacheOptions() {
      // FINAL function
    }
    
    
    /////////
    function parseRadioList() {
        return $.getJSON("https://api.myjson.com/bins/xiyvr");
    }
    
    function _parseiTunes() {
        return $.getJSON("https://itunes.apple.com/search?term=jackson&limit=10&callback=?")
    }
    
    function parseEachRadioData(radioList) {
        return Promise.all(radioList.map(radio => $.getJSON(radio.url + "/stats?sid=" + radio.stream_id + "&json=1&callback=?")));
    }
    
    function ParseEachHistoryData(radioList) {
        return Promise.all(radioList.map(radio => $.getJSON(radio.url + "/played?sid=" + radio.stream_id + "&type=json&callback=?")));
    }
    

    【讨论】:

    • 感谢您的回复,我在运行parseEachRadioData(radioList) 时收到以下错误。错误:jQuery.Deferred exception: radioList.map is not a function TypeError: radioList.map is not a function
    • 哦,所以parseRadioList返回的数据不是数组?我以为是你的代码
    • @DannyBoy - 如果 radioList 是一个对象,你可能需要parseEachRadioData(Object.values(radioList_data))
    【解决方案2】:

    第一眼

    $.when(parseRadioList())  // your code will wait her
      .then(function (list) {
        radioList_data = list;
    
        return $.when(
          parseEachRadioData(radioList_data), //  this two method are void they will complete 
          ParseEachHistoryData(radioList_data)  // immediately without waithing for getJson...
        );
    
      })
    

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 2014-05-14
      • 2015-11-26
      • 2020-05-13
      • 1970-01-01
      • 2011-08-07
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多