在javascript中我试图在变量中收集响应并打印它。它将打印变量undefind然后打印响应。它将首先打印servicedata = undefined 然后它将打印从服务器检索的响应。
var data = get(requiredUrl);
console.log('servicedata ='+jsonstr);
我认为它不是在等待响应并执行它下面的语句。为此,我必须使用线程;我怎么能在javascript中做到这一点?
function get(partenerUrl) {
var xhr = new XMLHttpRequest();
xhr.open('GET', partenerUrl, true);
xhr.send(null);
xhr.onreadystatechange = function() {
console.log('in onreadystatechange:' + xhr.readyState + 'status'
+ xhr.status);
if (xhr.readyState == 4 && xhr.status == 200) {
var arrayOfObjects = eval(xhr.responseText);
var jsonstr = JSON.stringify(arrayOfObjects)
console.log('response>>' + jsonstr);
return jsonstr;
}
return NETWORK_CONNECTION_NOT_FOUND;
}
}
答案 0 :(得分:0)
这里有一些错误。变量jsonstr
已在get
函数中声明,因此您的console.log('servicedata ='+jsonstr);
调用甚至无法访问它。
但这无论如何都行不通,因为你是正确的,调用是异步的,因此,该行将立即执行。您需要调用console.log
函数内的get
。你已经使用console.log('response>>' + jsonstr);
做了什么。所以不要真的看到问题是什么?
PS - 这与线程无关。
答案 1 :(得分:0)
两件事,首先你做
console.log('servicedata ='+jsonstr);
而不是
console.log('servicedata =' + data);
此外,你在这里做了一个(作为异步)jax查询
xhr.open('GET', partenerUrl, true /* The `true` here mean asynchronous`*/);
因此脚本不会等待xhr.onreadystatechange回调继续,get方法永远不会发送任何东西。如果你想获得实际的数据,你必须在xhr.onreadystatechange回调中进行,或者(并且这是一个不好的选择)将异步参数设置为false,但它最终会冻结你的应用程序。