Prototype的Ajax函数的语法糖

时间:2010-12-25 17:26:01

标签: javascript ajax prototypejs syntactic-sugar

我想为Ajax.Response()创建语法糖。

像这样:

AjaxGet = function(url) {
  ar = new Ajax.Request(url,
       { onSuccess: function(transport) {
             alert(transport.responseText);
             return transport.responseText;
          }
       });
  return ar.responseText;
}

那样

title = AjaxGet('/favouriteMovie?horrors=true')

将存储到title Ajax请求的变量结果。 但上面的功能代码不起作用,不返回responseText

2 个答案:

答案 0 :(得分:1)

ajax调用是异步的问题。 更简单的修复方法是在Ajax.Get调用中指定asynchronous:false。 E.g:

AjaxGet = function(url) {
  ar = new Ajax.Request(url,
       { onSuccess: function(transport) {
             alert(transport.responseText);
             return transport.responseText;
          },
         asynchronous: false
       });
  return ar.responseText;
}

但是我建议保留请求的异步功能,然后根据需要调整Success函数回调。

答案 1 :(得分:1)

只有使用同步Ajax才能执行此操作,您应该永远不会。整个浏览器的用户界面在请求期间将无法响应,您无法预测。

所以你能做的最好的事情将涉及某种回调:

function AjaxGet(url, callback) {
  new Ajax.Request(url, {
    onSuccess: function(xhr){ callback(xhr.responseText) }
  });
}

但这种方法存在问题:

  1. 它不允许您处理XML内容类型。
  2. 您将无法设置自定义标题。
  3. 您将无法处理任何类型的错误。
  4. 由于这些原因,我建议您在需要时使用完整的Ajax.Request