代码之家  ›  专栏  ›  技术社区  ›  stormdrain

从Ajax请求返回值到另一个函数

  •  0
  • stormdrain  · 技术社区  · 14 年前

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

    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=new Ajax.Request(urly,options) . 然后它会发出警报 [Object object] . 我如何返回 transport.responseText onclick 功能?

    2 回复  |  直到 13 年前
        1
  •  3
  •   Alsciende    14 年前

    你的请求不是 asynchronous:false . 所以X在请求完成之前会收到警报,并且 x 设置为 transport.responseText .

    您必须将请求设置为同步,或者在 onSuccess 方法。

    onSuccess的返回值被ajax.request丢弃。不要归还任何东西。

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

        2
  •  0
  •   kodisha    14 年前

    这是错误的!

    在执行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
    }); 
    

    您可以在这里看到代码的实际操作 http://jsfiddle.net/wbDhY/1/

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