1

しかし、どういうわけか、変数データいたずらに入れると、データの内容がありません。

function cookie() {
    var naughty = 'aaa';
    $.post('/cookie', function(data) {
        naughty = data;
    });
    alert(naughty); // sends "aaa"
}

なんで?

更新:ありがとう!$ .post()が非同期であるため、alert(naughty)が実行されてからデータが入力されます。

今、私はサブ質問があります:非同期をオフにすると、関数cookie()のみが実行を延期しますか、それともAJAXが完了するまでブラウザエンジン全体がフリーズしますか?

更新2:はい、@ Kevin B、あなたは正しいです、いたずらは決して満たされません...私は最初のコードサンプルで間違いを犯しました。とにかくすべての答えが2番目のコードサンプルだけで有効であることが幸運です:-)

@Kevin Bが指摘したように、async=falseはjQuery1.8で減価償却されます。そして、リクエストが完了するまでブラウザをフリーズします...

サブ質問#2:このAJAXリクエストの後、cookie()内にさらにコードがあります。それで、async = falseでブラウザ全体をフリーズせずに、AJAXが完了するまでcookie()の実行を何とか一時停止できますか?または、このアイデアをコーディングする新しい方法(complete / successコールバックを使用)を見つける必要がありますか?

最後の編集:私が欲しいのはASYNC:FALSEであることに気づきました...だから私は単にそれを使用しました。ところで。ASYNC:FALSEはjQueryから削除されません!特別な種類のユースケースのみが...

4

5 に答える 5

10

競合状態です。.post()は非同期関数であるため、いたずらがデータにリセットされる前にアラートが実行されます。

続行する前に応答を返すようにしたい場合は、.ajaxを使用してasyncをfalseに設定できます。

jQueryの$.postが非同期で動作するのを止めるにはどうすればよいですか?

于 2012-08-07T17:11:44.063 に答える
4

これを行うだけです:

function cookie() {
    var naughty = 'aaa';
    $.post('/cookie', function(data) {
        naughty = data;
        callNaughty(naughty);
    });
    
}

function callNaughty(naughty) {
  alert(naughty); 
}

また

function cookie() {
    var naughty = 'aaa';
    $.post('/cookie').done(function(data) {
        naughty = data;
        alert(naughty)
    });
}

$.post()非同期であるため、naughty応答が到着した後に更新されます。

ノート

async: falsejQuery1.8では非推奨です

于 2012-08-07T17:12:40.770 に答える
1

これは、$。postが非同期であるためです。ページが要求され、function(data)がまだ呼び出されていないため、実行はすぐにその行を離れるため、データは空になります。空のデータはアラートが取得するものです。これは、リクエストが完了した後にのみ機能します。たとえば、アラートステートメントが待機する必要がある同期方式の場合です。

于 2012-08-07T17:13:36.923 に答える
0

私の推測では、$。postは非同期で機能しています。したがって、ポストコールバックが実行される前にアラートが呼び出されます。ポストコールバックにアラートを配置すると、正しい結果が得られるはずです。

于 2012-08-07T17:18:12.940 に答える
0

これ$.postajaxリクエストであるため、本質的に非同期です。したがって、ajaxリクエストが完了した後、必要なことをすべて実行することを確認します。

function cookie() {
    var naughty ;
    $.post('/cookie', function(data) {
        naughty = data;
    }).done(function(){
        alert(naughty);
    });
}
于 2012-08-07T17:14:13.167 に答える