我有以下代码。
这一切都有效但我将问题的数据传递给另一个变量时遇到了问题。
在alert(items);
,它有所需的数据,但我无法将其传递给alert(personen);
我知道它与此有关,因为请求alert(personen);
执行时所需的数据不可用,但我不知道如何以合适的方式解决这个问题。
function getItems(type){
var items;
$.post('url' + type + '_ophalen', {},
function(data){
items = jQuery.parseJSON(data);
});
$(this).ajaxComplete(function() {
alert(items);
return items;
});
}
var personen = getItems('persoon');
alert(personen);
答案 0 :(得分:1)
我想查看数据是否存在,您应该在$ .post回调函数中执行此操作。
$.post('url' + type + '_ophalen', {},
function(data){ // callback func
items = jQuery.parseJSON(data);
console.log(items);
alert(items); // use both to see the power of console.log() ;)
});
for jQuery< v1.5你也可以使用$ .ajax() $ .post()只是$ .ajax()...
的包装版本$.ajax({
type: 'POST',
url: 'url' + type + '_ophalen',
data: {} // no data to send ? Then why POST method instead of GET ?
success: function(response) {
// code for response....
items = jQuery.parseJSON(response);
console.log(items);
alert(items); // use both to see the power of console.log() ;)
}
});
P.S。如果服务器使用pain/text
或`application / json
答案 1 :(得分:1)
这是问题所在:
var personen = getItems('persoon');
alert(personen);
你的函数getItems()
里面有异步功能,这意味着它以这种方式执行:
ajaxComplete
功能并继续执行所以基本上该函数不会返回任何内容,因为它在内部异步调用完成之前完成执行。并且它没有任何返回语句来返回任何内容。
这就是为什么它还解释了您的第一个警报什么也没有显示,第二个警告显示您的项目的行为。即使你可能认为应该先显示数据,然后再显示空数据(在功能完成执行之后)。这也可能会让你感到厌烦。
function() {
alert(items);
return items;
}
return items;
是此处显示的匿名函数的返回,而不是您可能想到的getItems()
函数的返回。
如果您想从getItems()
函数返回数据,则应使用同步调用。但您只能使用$.ajax()
来执行此操作,因为它支持async: false
。
虽然可以完成同步调用我建议您使用异步调用。事情可以以不同的方式完成,但如果您使用异步调用将提供更好的体验。 Ajax应用程序在事件驱动时更好,而不是程序性的,你在这里尝试做什么。
如果您需要在函数外部使用数据,您可以随时定义一个闭包变量(也可能是全局的,但通常不是一个好主意),它将在您的函数之外可用。
// creating a closure
(function(){
// closure-global variable
var personen = {
data: null,
available: false;
};
function getItems(type){
$.post('url' + type + '_ophalen', {}, function(data) {
personen.data = jQuery.parseJSON(data);
personen.available = true;
});
}
getItems('persoon');
// do other stuff in event-driven way
// like when a user clicks something
$("#SomeButtonOrLink").click(function(e){
e.preventDefault();
if (personen.available)
{
// do some processing
}
else
{
alert("Data not laoded.");
}
});
})();
所以基本上这段代码将是事件驱动的。我不知道何时应该加载项目,但它应该与某些事件相关(可能是页面加载或用户做某事)。所以一切都是由事件驱动的。加载项目(如果我们说它们应该在页面加载时加载)并且在完成后你不必处理任何事情,直到用户做某事(在上部场景中它是某个按钮或链接的点击事件)。这是事件驱动的执行。