1

編集: 上記の 2 つの質問は、私が必要としているものとは異なります。代わりに URL がありません。DWR を使用して JavaScript から直接 Java オブジェクトを呼び出すので、役に立ちません。

ページで人が何度も死んでいるかどうかを確認したいのですが、関数を再利用したいので、ajax のものを何度も書く必要はありません。再利用したいisDead()

問題は、ajax コールバックを待機しないため、常に false を返すことです。

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 を使用してください。

promise に慣れていない場合は、この記事を読んでください。質問に関連する例を取得するには、「パラメーターとして約束を受け入れる」セクションにジャンプしてください

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

于 2013-04-08T14:03:06.560 に答える