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 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

変数名の前に追加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

このようになるかもしれません:

 _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 に答える