我有这个:
var myError;
function getNames(user,location){
myError=null;
//Make an Ajax Call (this takes some time)
//On Success do this:
if(//Some Condition){
myError=false;
}else{
myError=true
}
}
function first(){
getNames(user, location);
if(myError==false){ //MYCONDITION
//do some custom stuff just for first();
}else{
alert("Failed");
}
}
function second(){
getNames(user, location);
if(myError==false){ //MYCONDITION
//do some custom stuff just for second();
}else{
alert("Failed");
}
}
现在,当我调用first()或second()时,它总是给我警告消息“FAILED”。问题是// MYCONDITION正在getNames()函数完成之前执行。我想在检查// MYCONDITION之前等待getNames()执行。
我无法设置延迟,因为我不知道getNames()要花多少时间。我正在考虑使用一些jQquery函数,但我似乎无法找到它。
而且,我试图让getNames()尽可能保持通用。所以,我正在考虑一种不打扰getNames()的方法。
我看到的最后一个选项是将getback()添加到getNames()。但是,这个函数也被其他函数调用,不需要回调()。
有什么想法吗?
感谢。
答案 0 :(得分:3)
添加回调完全没问题;你可以检查它是否存在:
function getNames(user, location, callback){
myError=null;
//Make an Ajax Call (this takes some time)
//On Success do this:
if(//Some Condition){
myError=false;
}else{
myError=true
}
if(callback) {
callback.apply();
}
}
如果你对arity不够通用感到困扰,你可以让函数接受一个对象而不是参数,所以:
function getNames(options) {
var user = options.user;
var location = options.loacation;
var callback = options.callback;
myError=null;
//Make an Ajax Call (this takes some time)
//On Success do this:
if(//Some Condition){
myError=false;
}else{
myError=true
}
if(typeof callback !== "undefined") {
callback.apply();
}
}
当你致电getNames
时,你可以这样做:
getNames({
user: "some user",
location: "some location",
callback: function() {
...
}
});
或
getNames({
user: "some user",
location: "some location"
});
答案 1 :(得分:1)
在jquery中,如果你不喜欢回调(我非常希望你不要:)),你很幸运我的朋友。 $ .ajax()函数中有一个标志,可用于为特定的AJAX请求关闭异步。以下是代码示例:
http://api.jquery.com/jQuery.ajax/
var x = 1;
jQuery.ajax({
url: 'http://example.com/catalog/create/',
success: function(result) {
x = 59;
},
async: false
});
console.log(x); //Should print 59 instead of 1