1

编辑:上面链接的两个问题不像我需要的那样。我没有 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;
     } 
4

3 回答 3

3

对我来说幸运的是,有一个特定于 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;
} 
于 2013-04-08T13:58:55.397 回答
2

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

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

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

于 2013-04-08T13:35:14.793 回答
0

改用承诺。

如果您不熟悉 Promise,请阅读这篇文章。要获取与您的问题相关的示例,请跳转到“Accept Promises As Parameters”部分

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

于 2013-04-08T14:03:06.560 回答