功能在JSON完成处理之前保持触发

时间:2015-10-27 10:40:53

标签: javascript jquery json

功能1:获取JSON数据&店

我正在创建一个脚本,其中一个抽搐通道数组将通过JSON函数循环进行处理,然后使用“localStorage.setItem”作为临时存储进行存储。我将它们保存在名称,查看器和URL中。

功能2:排序数据

以后可以使用存储的数据显示信息,而无需再次使用功能1。

问题

sortdata函数在函数1完成之前继续触发。由于数据未定义而导致错误。在控制台显示从函数1中存储的所有信息之前,会弹出此错误。

我的代码:

$(window).load(function(){
  $.when(getData()).promise().done(function(){
      getStoredObj();
  });
});

function getData(){
  var streamArray=[];

  jQuery.each (channels, function (i, channel) {
    channelId = channel.id;
    channelUrl = channel.url;

      var promise = $.ajax({
        dataType: "jsonp",
        url: twitchApi + channelId,
        success: 1,
        }).done(function ( data ) {

          if (data.stream == null) {

          } else {
            var displayName = data.stream.channel.display_name;
            var viewerCount = data.stream.viewers;
            streamArray.push({name: displayName, views: viewerCount, url: channelUrl});            

            localStorage.setItem("storedStreamArray", JSON.stringify(streamArray));
            console.log(JSON.stringify(streamArray));
          }
      });
  });
}

function getStoredObj () {
  var retrievedObject = localStorage.getItem('storedStreamArray');
  var parsedObject = JSON.parse(retrievedObject);

  <sorting codes here>
}

这里的一些帮助非常感谢。 :)

1 个答案:

答案 0 :(得分:1)

您使用$.when的结果来调用getData,但getData不返回任何内容,更不用说when可以使用的延迟了。因此,您无需等待,done回调会立即致电getStoredObj

getData中,您需要收集ajax次呼叫返回的所有延迟,并将其传递回来电。那看起来像是:

function getData(){
  return jQuery.map (channels, function (i, channel) {
      return $.ajax(...).done(function ( data ) {
        // Do work
      });
  });
}

每次迭代返回其ajax延迟,由map聚合并返回给调用者。然后,您可以对结果运行when并等待加载完成,然后再排序。