如何在返回true或false之前使函数等待ajax调用返回值?

时间:2013-04-08 13:32:40

标签: javascript jquery ajax dwr

编辑:上面链接的两个问题与我需要的不一样。我没有URL,而是使用DWR直接从javascript调用java对象,所以他们没有帮助我。

我想检查一个人是否在页面上多次死亡,我想重用一个函数,所以我不必多次写ajax的东西。我想重用isDead()

问题是它总是返回false,因为它不等待ajax回调。

如何在返回true或false之前让它等待?

function isDead(personId){
        PeopleManager.isPersonDead(personId,{
            callback : function(result)
            {
                if(result == 1){
                    //dead
                    return true;
                }else{
                    //alive
                    return false;
                }
            },
            errorHandler : function(e){
                alert(e); 
                }
        });

        return false;
     } 

3 个答案:

答案 0 :(得分:2)

一般情况下你不能,这是异步编程的主要问题。从技术上讲,你可以使AJAX调用同步,但这是一个坏主意。相反,isDead()需要接受回调才能收到答案

function isDead(id, callback) {
    PeopleManager.isPersonDead(id, function(result) {
        callback(result === 1);
    });
}

遗漏了一些细节,但这是一般的想法。您还可以查看promises以获得更现代的解决此问题的方法

答案 1 :(得分:2)

幸运的是,我有一个特定于DWR的答案。事实证明,您可以使用async:false

禁用异步功能
function isDead(personId){
    DWREngine.setAsync(false);
            PeopleManager.isPersonDead(personId,{
                callback : function(result)
                {
                    async:false,
                    if(result == 1){
                        //dead
                        return true;
                    }else{
                        //alive
                        return false;
                    }
                },
                errorHandler : function(e){
                    alert(e); 
                    }
            });
    return false;
} 

答案 2 :(得分:0)

改为使用承诺。

如果您不熟悉承诺,请阅读文章。要获得与您的问题相关的示例,请跳转到"接受承诺作为参数"

http://www.kendoui.com/blogs/teamblog/posts/13-03-28/what-is-the-point-of-promises.aspx