如何在Dojo中管理ajax响应

时间:2011-09-26 14:40:26

标签: javascript ajax dojo

好吧,这可能是一个愚蠢的问题,但我找不到解决问题的方法。我有这个功能:

function getActivityObj(sysId, date) {

    var activityObj = dojo.xhrGet({
         url: 'calendar/display-subactivities',
         content: {'sysId': sysId, 'date': date},
         handleAs: 'json',
         load: function(result) {
            console.log(result); 
         },
         error: function(){
             alert("error");
         }
    });

    var ajaxResponse = activityObj.ioArgs.xhr.response;
    return ajaxResponse;
 }

问题是我的ajaxResponse变量总是为空,但如果在firebug中,xhr对象的响应属性不为空。 我将在我的代码中的几个地方使用ajax响应,所以我做错了什么或者什么是更好的方式来调用ajax响应?谢谢。 (抱歉我的英语不好)

1 个答案:

答案 0 :(得分:4)

我怀疑调用它时ajaxResponse变量为空,因为xhrGet()调用是异步调用的,当你设置ajaxResponse并从中返回时,结果实际上不可用你的功能。

当你在firebug中查看它时,XHR响应已经完成,但是当代码执行时它就不存在了。

xhrGet()会返回dojo.Deferred个对象。您可以使用它来为实际完成时添加回调函数:

function getActivityObj(sysId, date) {
    var activityObj = dojo.xhrGet({
         url: 'calendar/display-subactivities',
         content: {'sysId': sysId, 'date': date},
         handleAs: 'json',
         load: function(result) {
            console.log(result); 
         },
         error: function(){
             alert("error");
         }
    });

    var ajaxResponse;

    // activityObj is a Deferred
    activityObj.addCallback(function() {
      // Use your deferred response 
      ajaxResponse = activityObj.ioArgs.xrh.response;

      // Now inside this function, do whatever you were going to do
      // with the xhr return data that you intended to return from
      // the wrapping function.
    });
 }

我不确定是否有一种很好的方法将xhrGet()调用包装在函数中并尝试返回响应,因为如果异步调用它将永远延迟。

如果在xhrGet()调用实际返回数据之前阻止进一步执行是安全的,则可以同步调用它。然后你的代码将在没有延迟回调的情况下工作。相反,您通常会在xhrGet()的{​​{1}}函数中执行返回数据的所有工作。

load()