在jQuery中访问ajax调用之外的JSONP数据

时间:2013-01-30 06:11:33

标签: javascript json jquery jsonp

现在,前五页结果中的每个Google链接都是:在我的浏览器中访问过,我需要问...

如何让JSON数据正常工作,以便我可以访问它/用其他方法操作它?

_otherMethod: function() {

  // END GOAL OF WHERE I WANT THIS TO BE AVAILABLE
  var text = this._requestText();
},

_requestText: function() {
  var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
  $.ajax({
      type: 'GET',
      url: url,
      async: false,
      dataType: 'jsonp',
      success: function(data) {

        // works here
        console.log(data);

        // works here as well & fires local function
        testing(data);

        // doesnt store
        var testvar_1 = data;
      }
  });

  // undefined
  console.log(testvar_1);

  function testing(data) {
    // logs when called from above
    console.log(data);

    // doesnt store
    var testvar_2 = data;
  }

  // undefined
  console.log(testvar_2);

  // havent found this yet...
  return magicVariableThatLetsMeAccessJSON
}, ...

任何想法?我知道关于堆栈溢出的许多其他类似问题,但我发现没有解决这个问题。

感谢

更新

var storage;
var yourobj = {
    _otherMethod: function() {
      // END GOAL OF WHERE I WANT THIS TO BE AVAILABLE
      var text = this._requestText();
    },
    _requestText: function() {
      var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
      $.ajax({
          type: 'GET',
          url: url,
          async: false,
          dataType: 'jsonp',
          success: function(data) {
            storage = data;

            // logs correctly
            console.log(storage);
          }
      });
    }
}
//undefined
console.log(storage);
yourobj._requestText();
//undefined
console.log(storage);

4 个答案:

答案 0 :(得分:2)

首先,如其他地方所述,您需要一个范围内的变量,其次,您需要确保在调用回调之前不对其进行评估。

确保这一点的唯一方法是在成功回调方法中调用_otherMethod

_otherMethod: function(text) {
   //...do what ever you need to do with text
},

_requestText: function() {
  var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
  $.ajax({
      type: 'GET',
      url: url,
      async: false,
      dataType: 'jsonp',
      success: function(data) {
         _otherMethod(data);
      },
      }
  });
}

回调是异步的,意味着它们在某个时间点被调用,而这些时间点不是由代码行序列决定的。 如果您知道在执行成功回调之前永远不会调用使用返回数据的代码,并且您需要保留数据,则可以将代码更改为

_otherMethod: null, //not strictly needed    
_requestText: function() {
  self = this;
  var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
  $.ajax({
      type: 'GET',
      url: url,
      async: false,
      dataType: 'jsonp',
      success: function(data) {
         self._otherMethod = function(data){
              return function(){
                 //do what you need to with data. Data will be stored
                 //every execution of _otherMethod will use the same data
                 console.log(data);
              }
         }
      },
      }
  });
}

答案 1 :(得分:1)

通过在变量名称前添加var,可以在当前范围内创建局部变量。

这不起作用:

var a = 2;

(function() {
    var a = 3;
})();

console.log(a); // 2

虽然这样做:

var a = 2;

(function() {
    a = 3;
})();

console.log(a); // 3

由于您尝试设置的变量位于外部作用域中,因此在内部作用域中使用它时,请删除var

答案 2 :(得分:1)

很简单。您需要在回调函数的上下文之外的存储变量。

var storage;

var yourobj = {

    _otherMethod: function() {

      // END GOAL OF WHERE I WANT THIS TO BE AVAILABLE
      var text = this._requestText();
    },

    _requestText: function() {
      var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
      $.ajax({
          type: 'GET',
          url: url,
          async: false,
          dataType: 'jsonp',
          success: function(data) {

            storage = data;

          }
      });


    }

}

或者,存储可以是同一对象的属性。

答案 3 :(得分:1)

可能就是这样:

 _requestText: function() {
   var url = 'http://api.flickr.com/services/feeds/photos_public.gne?format=json';
   var testvar_1;
   $.ajax({
     type: 'GET',
     url: url,
     async: false,
     dataType: 'jsonp',
     success: function(data) {
       console.log(data);
       testing(data);

       testvar_1 = data;
     }
   });

   // should work here
   console.log(testvar_1);

实际上你在那里创建了var的新实例。