在大多数情况下,我的代码都在工作,但显然我对AJAX或/和/或如何将响应数据存储在所需的变量中产生了误解。
var stored_data = getData(url, function(data){
return data;
});
我期望stored_data = data
,但那没有发生。
如果我将return data
替换为console.log(data)
,很明显我正在收到预期的数据。
我有点困惑为什么没有将数据分配给stored_data
function getData(source, callback) {
var xhr = new XMLHttpRequest();
var result= '';
xhr.open("GET", source);
xhr.responseType = "document";
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200){
result = xhr.responseXML.getElementsByTagName('pre')[0].innerHTML;
callback(result);
}
}
xhr.send();
}
我是否正确地将stored_data
的值设置为AJAX请求的结果?
注意:在阅读我断言为DUPING的问题后,我问了这个问题。 另一个问题有很多概念上的细节。就我要解决的问题而言,我的问题非常简单。
我对将函数调用结果赋值给变量有什么误解?感觉这很简单,我没看到。
显然,我对变量和函数赋值感到困惑。
例如
var somevariable = sum(9,1);
function sum(a, b){return a + b}
console.log(somevariable) // returns 10
因此,有了这种理解,
如果我调用getData
函数并将其分配给变量
数据应该放在那个容器中吗?
如果我console.log()
,可以使用回调函数
但是,如果将其记录到控制台,则无法使用该信息。
所以我误解了variable = synchronous_result
与variable = async_result
如何使用VANILLA JS和回调将变量解析为异步调用的检索结果?我的误解是什么,如何理解似乎很简单的问题?
我理解异步。那么,如何获取要解析的数据? 除了检索数据然后存储它之外,我不需要对数据做任何其他事情?
解决方案:为了避免他人遭受类似的误解 在帖子中借用了这个据称是重复的概念:
我有一个对象,该对象的属性要用URL中的数据填充。 这需要AJAX操作。
datastore.info
是属性和对象。
解决方案采用以下代码形式:
datastore.info = getINFO(url, function(data){datastore.info = data;});
就是这样。
对我来说,这是违反直觉的。 我原以为函数调用会产生一个值,但是对于异步代码,函数调用不会导致赋值。这是来自异步步骤的延迟动作。
结果是,在断言回调时发生分配。这种逻辑与同步编码背道而驰,并且通过这种特别简单的练习可以清楚地看到这一点。
当您认为自己所没有的帮助实际上并不存在时,自学就是一个bit子。 但是,花8个小时来解决一线问题确实会使人意识到自己的坚持。
弄清楚这一点有助于我“提高”回调,异步操作的概念,并有望将其作为“超时”操作的强大工具。