1

関数内で $.post を使用して結果を取得し、$.post コールバックの結果に基づいて関数 true または false を返そうとしています。ただし、コールバックは、親関数の return イベントの後に発生するようです。

これが現在のコードです。ret 変数は常に未定義ですが、$.post コールバック内で alert() を実行すると、正しい結果が返されます。

function elementExists(key, type, path, appid, pid){
    var ret;
    $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
        ret = data;                         
    });

    alert(ret);
    return ret;

}
4

3 に答える 3

2

ご存じのとおり、投稿は非同期で行われます。同期させたい場合は、ajaxメソッドを使用してasyncパラメーターを false に設定する必要があります。ただし、ポストが非同期であることを認識し、コールバックによって実行されるアクションがポストを呼び出すメソッドとは無関係になるようにコードを作成することをお勧めします。明らかに、本当にアラート以外のことをしたいのですが、これをリファクタリングする方法をアドバイスするのは難しいことを知りません。

編集:あなたのコードが何かが存在するかどうかを確認していることは理解していますが、目的のためにそれを確認しています。目的が何であるかを知っていれば、メソッドをリファクタリングできるように、コールバックでそれを達成する方法を推奨できる可能性があります。

于 2009-05-05T11:23:44.617 に答える
1
function elementExists(key, type, path, appid, pid){
        $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
           alert(data);
        });
  }

関数(データ)はコールバック(非同期)であり、そのような値を返すことはできません。

ページの呼び出しが完了するまでコールバックは呼び出されませんが、 $.post を呼び出した直後に「return ret」が実行されます

同期に設定したい場合は async を設定: false

ドキュメント http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktypeを参照してください

于 2009-05-05T11:21:07.477 に答える
0

問題は、コードが非同期で実行されることです。つまり、Ajax リクエストが完了したときに発生する ret = data の前に、alert(ret) が実際に呼び出されます。

asyncオプションを使用して ajax 呼び出しを同期させる (推奨されません)か、コードを再設計することができます。

于 2009-05-05T11:22:11.077 に答える