我正在尝试从(传输)向调用函数返回一个值,但似乎无法使其工作:
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
函数?
答案 0 :(得分:3)
您的请求不是asynchronous:false
。因此,在请求完成并x
设置为transport.responseText
之前,会提醒x。
您必须将请求设置为同步,或者在onSuccess
方法中设置警告x。
Ajax.Request会丢弃onSuccess的返回值。不要退货。
Ajax本质上是异步的。您应该查询服务器,然后在回调中处理响应。所以你不应该尝试在onclick函数中使用服务器值,而应该在单独的回调中使用(onSuccess方法)。
答案 1 :(得分:0)
这是错的!
在进行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秒内出现)