我有一个异步的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;
答案 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);