0

我有这个:

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() 函数完成之前被执行。我想等待 getNames() 执行,然后才能检查 //MYCONDITION。

我无法设置延迟,因为我不知道 getNames() 将花费多少时间。我正在考虑使用一些 jQquery 函数,但我似乎找不到一个。

而且,我试图让 getNames() 尽可能通用。所以,我正在考虑一种不打扰 getNames() 的方法。

我看到的最后一个选项是将回调()添加到 getNames()。但是,这个函数也被其他不需要回调()的函数调用。

有什么想法吗?

谢谢。

4

2 回答 2

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"
});
于 2012-09-13T16:24:58.080 回答
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
于 2012-09-13T16:28:48.847 回答