0

现在结果前 5 页中的每个 google 链接都是 :visited in my browser, 我需要问...

如何让 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

4 回答 4

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);
              }
         }
      },
      }
  });
}
于 2013-01-30T06:30:31.140 回答
1

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

这不起作用:

var a = 2;

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

console.log(a); // 2

虽然这样做:

var a = 2;

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

console.log(a); // 3

var由于您尝试设置的变量位于外部范围内,因此在内部范围内使用它时请摆脱它。

于 2013-01-30T06:16:20.197 回答
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;

          }
      });


    }

}

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

于 2013-01-30T06:19:30.373 回答
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那里创建一个新实例。

于 2013-01-30T06:30:56.653 回答