0

ここで質問する前に、しばらく答えを探していましたが、行き詰まってしまいました。

私に似た記事/質問をいくつか読みましたが、次の記事で終わりました:

そして、私はこれで終わった:

var del_act = (function(){
    var resp;

    $.post(url+'delete/'+id, 'json')
    .done(function(data) {
        custom_alert(type.toUpperCase()+' deleted succesfully!');
        if(redirect)
            window.location.replace(url);
        resp = true;
    })
    .fail(function(jqXHR, textStatus, errorThrown) {
        console.log(jqXHR);
        if(jqXHR['status'] == 404)
            custom_alert(type + ' not found');
        resp = false;
    });

    return {getResp: function()
    {
        console.log(resp);
        return resp;
    }};
})();

console.log(del_act.getResp());

しかし問題は、両方console.logの s がundefined応答を返すことです。withを使用できることはわかっていますが、使用$.ajax()async: false,たくないので、trueまたはfalse応答を返す方法を見つけようとしています。

4

3 に答える 3

3

$.post()つまり、リクエストが送信された直後に戻り、その後のコードが順次実行されます。この場合、console.log呼び出されますが、リクエストは非同期で実行されているため、戻り値を取得できません。

この種の非同期シナリオに対処する方法は、コールバックを使用することです。returnCallback パラメータを指定し、呼び出しの「完了」コールバックで$.post呼び出します。

var del_act = (function(doneCB){
    var resp;

    $.post(url+'delete/'+id, 'json')
    .done(function(data) {

        // Call CALLBACK specifying return status
        doneCB(true)
    })

非同期コードの問題は、カスケード コールバックですべてを行う必要があることです。たとえば、次のことはできません。

console.log(del_act(whatever))

前にundefined説明したように、非同期関数はまだ個別に実行されているためです。別の考え方をする必要があります。この場合、作業が完了した後に console.log が発生するように設定する必要があります。

del_act(function() { console.log("del_act finished, status OK!"); }
于 2013-02-26T13:42:53.743 に答える
1

そのような ajax 呼び出しから変数を転送することはできません。

代わりに、成功/失敗内で true または false の値を渡す関数を呼び出し、関数内にコードを配置して、その true/false 出力に作用するようにする必要があります。

于 2013-02-26T13:39:22.303 に答える
-1
jqXHR

それは自己であり、オブジェクトであり、コンソールに直接同じものを書き込むと、未定義またはオブジェクトのいずれかが出力として提供されます。
サーバーから返される応答は、失敗イベントを発生させているため、有効ではないようです。有効なJSONデータ
を返していることを確認してください。

問題をよりよく理解するために、リンクを投稿する必要があります。

于 2013-02-26T13:42:14.580 に答える