将异步jsonp结果分配给变量

时间:2017-11-01 14:38:34

标签: javascript asynchronous jsonp

我有一个异步的jsonp-Call,并尝试将结果分配给变量" FILL_ME"在下面的例子中。

onSuccess函数被称为成功,但是不可能将它的值赋给变量" FILL_ME"。而是抛出错误:Uncaught TypeError:无法读取属性' 0'未定义,这似乎是一个范围问题。

请查看以下代码。

在onSuccess方法之前触发console.log(" final" + FILL_ME)。

如何将结果分配给变量?



function foo() {
  var FILL_ME = 'OVERWRITE ME';
  var $jsonp = (function() {
    var that = {};
    that.send = function(src, options) {
      var callback_name = options.callbackName || 'jsonCallback',
        on_success = options.onSuccess || function() {},
        on_timeout = options.onTimeout || function() {},
        timeout = options.timeout || 10; // sec
      var timeout_trigger = window.setTimeout(function() {
        window[callback_name] = function() {};
        on_timeout();
      }, timeout * 1000);
      window[callback_name] = function(data) {
        window.clearTimeout(timeout_trigger);
        on_success(data);
      }
      var script = document.createElement('script');
      script.type = 'text/javascript';
      script.async = true;
      script.src = src;

      document.getElementsByTagName('head')[0].appendChild(script);
    }
    return that;
  })();

  $jsonp.send('https://run.plnkr.co/plunks/v8xyYN64V4nqCshgjKms/data-2.json', {
    callbackName: 'jsonCallback',
    onSuccess: function(json) {
      console.log('onSuccess!' +json);
      FILL_ME = json["sites"][0]["siteName"];
      console.log(FILL_ME);
    },
    onTimeout: function() {
      console.log('onTimeout!');
      FILL_ME = '';
      console.log(FILL_ME);
    },
    timeout: 5
  });
  console.log("final " +FILL_ME)
}

<body onLoad="foo()">

</body>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

  

无法阅读财产&#39; 0&#39;未定义的

指的是您尝试访问jsonp调用返回的数据的位置,特别是您尝试访问数组的属性0 的位置:

json["sites "][0]["siteName"];

这意味着json["sites "]未定义。可能是因为sites之后的额外空间。如果删除该空格,它似乎正常工作:

http://plnkr.co/edit/UpGMxruppHeh1U8x0j7B

如果你想使用onSuccess回调之外的变量,你必须编写另一种你调用的方法并传递FILL_ME,如下所示:

function runAfterSuccess(p_FILL_ME) {
  console.log("Here I can do whatever I want with FILL_ME", p_FILL_ME);
}

然后在onSuccess回调中使用:

runAfterSuccess(FILL_ME);