0

看看下面的代码。问题很简单,如果方法 findUserInfo ajax 代码返回错误,我该如何打破这个 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 回答