1

我有这个简单的脚本:

function paginateUsers(page){
   get( _config_remote_host+'/users?page='+page,function(json){

      json = JSON.parse(json);
        var _html = "";
        var json_users;
        var json_num_users;

        if(json.users){
        json_users = json.users;
        json_num_users = json.number_of_users;
        }
        if(!json.users){
            json_users = json;
            json_num_users = 0;
        }
        for(i = 0; i < json_users.length; i ++){
          if(i == 0){ _html += '<div class="row-fluid separator20">';}
          _html += '<div class="span3 media userbox">'
                      +'<div class="row-fluid">'
                       + '<div class="span3">'
                        + ' <a class="thumbnail" href="#">'
                         +' <img src="jon.png" alt=""/>'
                        +'  </a>'
                       +' </div>'
                        +'<div class="span9">'
                         +' <ul class="unstyled">'
                          +'  <li><strong><a href="user.html?id='+json_users[i].id+'">'+json_users[i].first_name+'</strong></br>'+json_users[i].last_name+'</a></li>'

                             +'   <li><h6>New york city</h6></li>'
                        +'    <li><a class="pull-right btn btn-mini">Contact</a></li>'
                       +'   </ul>'
                      +'  </div>'
                     +' </div>'
                    +'</div>';
                if(i%3 == 2){ _html += '</div><div class="row-fluid separator20">';}
             } 

        $('.users-list').html(_html).hide().fadeIn(100);
        //return always total users number to calculate total links number
        return json_num_users;
        });

  }

然后我做

var n = paginateUsers(1);
    alert(n)

但它总是提醒'未定义',这里真正的问题是什么?

这里的ajax调用和init函数:

function createCORSRequest(_method, _url){
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    // Check if the XMLHttpRequest object has a "withCredentials" property.
    // "withCredentials" only exists on XMLHTTPRequest2 objects.
    xhr.open(_method, _url, true);
  } else if (typeof XDomainRequest != "undefined") {
    // Otherwise, check if XDomainRequest.
    // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
    xhr = new XDomainRequest();
    xhr.open(_method, _url);
  } else {
    // Otherwise, CORS is not supported by the browser.
    xhr = null;
  }
  return xhr;
}

/*END INIT FUNCTION*/

function get(_url, _callback){
  var xhr = createCORSRequest('GET',_url);
  if (!xhr){
    throw new Error('CORS not supported');
  }
  $('.ajax-loading').show();
  xhr.send();

  /*SUCCESS -- do somenthing with data*/
  xhr.onload = function(){
    // process the response.
    _callback(xhr.responseText);
    $('.ajax-loading').hide();
  };

  xhr.onerror = function(e){
    console.log(e);
    $('.ajax-loading').show();
  };
}

谢谢

4

3 回答 3

1

您不能从 AJAX 调用返回,它是异步的。您的返回值在回调函数中,该函数在将来某个时间点执行 AJAX 调用时运行。 paginateUsers实际上并没有返回任何东西(这意味着它返回undefined)。

您应该在回调中执行与数据相关的所有操作,而不是尝试返回任何内容。或者,最好传递一个回调函数,并在完成后调用它。

function paginateUsers(page, callback){
    get( _config_remote_host+'/users?page='+page,function(json){
        // code...
        if(typeof callback === 'function'){
            callback(json_num_users); // Instead of "return json_num_users;"
        }
    });
}

然后你可以这样做:

paginateUsers(1, function(result){
    // result should be the value of json_num_users
});
于 2012-05-08T20:31:06.447 回答
0

paginateUser如果您返回 的结果,则您不会从 中返回任何内容get,这可能应该是$.get您将拥有延迟对象(在 jquery 1.5 之后),该对象具有done then接受相应回调作为参数的方法

你也可以这样做

var p = $.get(....)  ( or $.post or $.ajax etc )

$.when(p).done(mydone).fail(myfail)

function mydone(data){  }
function myfail(err) {  }

已编辑:在您进行编辑后,我看到您正在自己实现 ajax 调用,并使用 jquery 进行 DOM 操作,这很奇怪

最好只使用$.getJSON接受 url 并返回延迟对象的方法,它更易于使用并且具有可靠的 API

于 2012-05-08T20:30:41.703 回答
0

$.get 正在异步运行 - 它向服务器发起一个新请求,当所有服务器端处理完成后,它将返回一些东西。

但是您的 paginateUser() 函数在浏览器中运行,它只是发送请求(到无处/到服务器)而不等待结果。

于 2012-05-08T20:37:07.437 回答