0

以下のコードをご覧ください。質問は簡単です。メソッドfindUserInfoajaxコードがエラーを返した場合、このforループをどのように中断しますか。要するに、私が望むときはいつでも、どうすればこのforループから抜け出すことができますか?ajax呼び出しが非同期であるためですか?

 jQuery.each(d, function() {
    findUserInfo(this);
 });

function findUserInfo(userID){


var req = $.ajax({
url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
dataType : "jsonp"

});

req.success(function(msg) {
    console.log('Yes! Success!');

});

req.error(function(msg) {
    console.log('Error');
});


}   
4

5 に答える 5

2

はい、jQuery.ajaxは非同期であるため、次のようなものを使用する必要があります。

function findUserInfos(datas){
  var userID=datas.shift(); //remove and return the first element

  var req = $.ajax({
    url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
    dataType : "jsonp"
  });

  req.success(function(msg) {
    console.log('Yes! Success!');
    findUserInfos(datas)
  });

  req.error(function(msg) {
    console.log('Error');
  });
}   

findUserInfos(d);

私たちは成功を続けるだけなので、エラーが発生するとすぐに壊れます。

于 2012-04-19T17:29:33.770 に答える
1

async:falseを設定するのはひどい考えです。これにより、ajax呼び出しが行われている間、ブラウザーがハングします。 Frame.jsは、次のような問題を解決するために設計されました。

jQuery.each(d, function() {
    findUserInfo(this);
});

Frame.useTimeout = false; // turn off Frame's error recovery

function findUserInfo(userID){

    Frame(function(next){

        var req = $.ajax({
        url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
        dataType : "jsonp"

        });

        req.success(function(msg) {
            console.log('Yes! Success!');
            next();
        });

        req.error(function(msg) {
            console.log('Error');
            // don't call next and Frame will stop
        });

    });

}  
Frame.init();
于 2012-04-19T17:36:33.100 に答える
0

ループを解除するには、falseを返します

エラーハンドラ内でエラーをスローした場合:

throw 'Error: ' + userID;

その後、書くことができます

jQuery.each(d, function() {
    try {
        findUserInfo(this);
    } catch(err) {
      return false;
    }
 });

編集:他の人がコメントしているように、成功ハンドラーからtrueを返し、エラーハンドラーからfalseを返し、return findUserInfo(this);を呼び出す方がよいでしょう。ループ内。もちろん、ajax呼び出しを同期的に行うと、ブラウザーがフリーズするリスクがあります。

于 2012-04-19T17:30:49.753 に答える
0

すべてのIDを配列として保存し、それらをサーバーに転送してから、特定の結果を確認するのはどうですか?これにより、多くのリクエストを節約できます。IDを配列として収集し、POSTを介して転送することができます["id1","id2",...].join(",")

または、事前にすべてをフェッチし、フェッチ後にループを開始します...

すでに述べたように、非同期の性質のため、ループを分割することはできません... async:false; 同様に役立つ可能性がありますが、UIが更新されないようにします(これにより、多くの要求のためにブラウザーがビジー状態になります)

于 2012-04-19T17:33:23.750 に答える
-1

ajax呼び出しにasync:falseを設定することで、ajax呼び出しを同期させることができます。すべての例外をキャッチするためのエラー関数がすでにあります。だから私はそれがすべきだと信じています

           $.ajax({
            type: "GET",
            url: "/abc/GetNodesById",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: { "nodeId": '' },
            async: false,
            cache: false,
            success: function (data) {
              //Do Work
            }
            error : function(jqXHR, textStatus, errorThrown){
                // Handle Error
                // Return False 
            }
      });
于 2012-04-19T17:27:30.823 に答える