我是JavaScript新手,我很难理解回调函数。
我在下面有一个函数返回一个数组,然后是另一个调用第一个函数的函数。问题是,第二个函数中的数组总是未定义的,即使在第一个函数中返回一个对象数组。
function getItems() {
$.get(url,
function(data) {
var obj = $.parseJSON(data);
var itemArr = $.map(obj, function(ele) { return ele; })
return itemArr;
});
}
function alertTest() {
var items = getItems();
alert(items);
}
我理解第一个函数是异步的,因此第二个函数中的警报在返回的数组之前被调用,这导致第二个函数警告未定义的对象。
我知道有很多相关的文档,但我很难理解它是如何工作的。有人可以告诉我需要进行的更改,以便在调用getItems函数后,alertTest函数返回填充的数组吗?
提前致谢!
答案 0 :(得分:1)
$.get
是async
函数。这意味着在命中时会调用callback
函数,并在内部返回响应。
现在return itemArr
实际上是由回调函数返回的
<{1}}实际上并没有返回任何内容,因此它总是未定义的。
要使您的代码正常工作,
getItems()
这会调用 function getItems() {
$.get(url,
function(data) {
var obj = $.parseJSON(data);
var itemArr = $.map(obj, function(ele) { return ele; })
alertTest(itemArr);
return itemArr;
});
}
函数。
答案 1 :(得分:0)
这样做的一种方法是使用像这样的JS Promises
function getItems() {
return Promise.resolve(
$.get(url,
function (data) {
var obj = $.parseJSON(data);
var itemArr = $.map(obj, function (ele) {
return ele;
})
return itemArr;
}));
}
function alertTest() {
var items = getItems().then(function (items) {
alert(items);
});
}
很难理解你的想法。 Promises允许您编写以同步代码的顺序运行的代码。
你可以在函数中插入回调函数,并在get请求完成时调用,如Rhea的其他答案所示,但这是一种更简洁的方法,Promises现在是Javascript语言的一部分。
答案 2 :(得分:0)
function getItems() {
$.get(url, function(data) {
var obj = $.parseJSON(data);
var itemArr = $.map(obj, function(ele) { return ele; })
alertTest(itemArr);
});
}
function alertTest(items) {
alert(items);
}
getItems();