Javascript 从ajax请求向另一个函数返回值

Javascript 从ajax请求向另一个函数返回值,javascript,ajax,prototypejs,Javascript,Ajax,Prototypejs,我试图从(传输)返回一个值到调用函数,但似乎无法使其工作: function createXMLHttpRequest( w ) { var urly = '/users/notes/' + w; var options = { method:'get' , onSuccess: function( transport ) { x = transport.responseText; return x; }

我试图从(传输)返回一个值到调用函数,但似乎无法使其工作:

function createXMLHttpRequest( w )
{
  var urly = '/users/notes/' + w;
  var options = {
      method:'get'
    , onSuccess: function( transport )
      {
        x = transport.responseText;
        return x;
      }
    , onFailure: function( transport )
      {
        var response = transport.responseText;
        alert( "FAILED "+ response );
      }
  };
  new Ajax.Request( urly, options );
  alert( x );
}

var ai = $( 'addItem' );
ai.onclick = function()
{
  // -1 indicates new
  addnote( -1, null );
}

x
始终未定义警报。除非我将
x
分配给
Ajax.Request
例如
x=newajax.Request(urly,options)
。然后它将发出警报
[Object Object]
。如何将
transport.responseText
的值返回到
onclick
函数?

您的请求不是
异步:false
。因此,在请求完成之前会向x发出警报,
x
设置为
transport.responseText

您必须将请求设置为同步,或在
onSuccess
方法中发出警报x

来自onSuccess的返回值被Ajax.Request丢弃。不要退回任何东西


Ajax本质上是异步的。您应该查询服务器,然后在回调中处理响应。因此,您不应该尝试在onclick函数中使用服务器值,而应该在单独的回调(onSuccess方法)中使用服务器值。

您的请求不是
异步的:false
。因此,在请求完成之前会向x发出警报,
x
设置为
transport.responseText

您必须将请求设置为同步,或在
onSuccess
方法中发出警报x

来自onSuccess的返回值被Ajax.Request丢弃。不要退回任何东西

Ajax本质上是异步的。您应该查询服务器,然后在回调中处理响应。因此,您不应该尝试在onclick函数中使用服务器值,而应该在单独的回调(onSuccess方法)中使用服务器值。

这是错误的

在进行ajax调用时,您应该忘记考虑同步,而是考虑异步! 将请求发送到某个url,并发送一个回调函数,该函数将在请求返回某些数据时执行

我为GET调用编写了简单的包装器

// AJAX WRAPPER
MYPROJECT = {};
MYPROJECT.Ajax = (function() {
    return{

        // get data by AJAX call and return as plain text
        get:function(url, callback) {
            new Ajax.Request(url, {
                method: 'get',
                onSuccess: function(transport) {
                    var data = transport.responseText.evalJSON();
                    callback(data);
                }
            });
        }
    }    
})();

// USAGE  
MYPROJECT.Ajax.get('/ajax_json_echo/?foo=bar',function(data){

    alert(data);
    $('containerText').innerHTML = data.get_response.foo
}); 
您可以在这里看到正在运行的代码

(请耐心等待,警报框应在2秒钟后出现)

这完全是错误的

在进行ajax调用时,您应该忘记考虑同步,而是考虑异步! 将请求发送到某个url,并发送一个回调函数,该函数将在请求返回某些数据时执行

我为GET调用编写了简单的包装器

// AJAX WRAPPER
MYPROJECT = {};
MYPROJECT.Ajax = (function() {
    return{

        // get data by AJAX call and return as plain text
        get:function(url, callback) {
            new Ajax.Request(url, {
                method: 'get',
                onSuccess: function(transport) {
                    var data = transport.responseText.evalJSON();
                    callback(data);
                }
            });
        }
    }    
})();

// USAGE  
MYPROJECT.Ajax.get('/ajax_json_echo/?foo=bar',function(data){

    alert(data);
    $('containerText').innerHTML = data.get_response.foo
}); 
您可以在这里看到正在运行的代码


(请耐心等待,警报框应在2秒钟后出现)

Saweet。谢谢文档中说:“既然同步使用相当令人不安,而且通常味道不好,你应该避免改变它。说真的。”为什么它会令人不安,而且味道不好?这仅仅是因为它不是真正的ajax吗?它不仅仅是炒作。使请求同步将减慢您的UI速度,并且您的js线程可能会被某些net failure.Saweet阻塞。谢谢文档中说:“既然同步使用相当令人不安,而且通常味道不好,你应该避免改变它。说真的。”为什么它会令人不安,而且味道不好?这仅仅是因为它不是真正的ajax吗?它不仅仅是炒作。使请求同步将减慢您的UI速度,并且您的js线程可能会被某些网络故障阻塞。