Javascript 如何在Dojo中管理ajax响应

Javascript 如何在Dojo中管理ajax响应,javascript,ajax,dojo,Javascript,Ajax,Dojo,好吧,这可能是个愚蠢的问题,但我找不到解决问题的方法。我有这个功能: function getActivityObj(sysId, date) { var activityObj = dojo.xhrGet({ url: 'calendar/display-subactivities', content: {'sysId': sysId, 'date': date}, handleAs: 'json', load:

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

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对象的response属性不是空的。 我将在代码中的几个地方使用ajax响应,那么我做错了什么,或者调用ajax响应的更好方法是什么?非常感谢。抱歉,我的英语不好

我怀疑在调用ajaxResponse变量时它是空的,因为Xhret调用是异步进行的,而在设置ajaxResponse并从函数返回它时,结果实际上还不可用

var activityObj = dojo.xhrGet({
     // Call synchronously
     sync: true,
     url: 'calendar/display- subactivities',
     content: {'sysId': sysId, 'date': date},
     // etc...
当您在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的load函数中执行返回数据的任何工作

var activityObj = dojo.xhrGet({
     // Call synchronously
     sync: true,
     url: 'calendar/display- subactivities',
     content: {'sysId': sysId, 'date': date},
     // etc...
我怀疑在调用ajaxResponse变量时它是空的,因为xhrGet调用是异步进行的,而在设置ajaxResponse并从函数返回它时,结果实际上还不可用

var activityObj = dojo.xhrGet({
     // Call synchronously
     sync: true,
     url: 'calendar/display- subactivities',
     content: {'sysId': sysId, 'date': date},
     // etc...
当您在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的load函数中执行返回数据的任何工作

var activityObj = dojo.xhrGet({
     // Call synchronously
     sync: true,
     url: 'calendar/display- subactivities',
     content: {'sysId': sysId, 'date': date},
     // etc...

我更喜欢使用.then promise方法,而不是来自Deferred的原始addCallback等方法。然后你就可以用很多简洁的方式来写东西了。@missingno我以前是从Dojo1.2开始的。然后可能是1.4了吧?。我只是没有养成使用它的习惯,因为我没有完全用更新的1.5+代码完成一个大型项目。实际上,您也可以使用addCallback、addErrback等链接回调,尽管它们的行为有些不同,而且区别很重要。在国际海事组织,最好是学习新的方式与承诺向前迈进。另见:哇!谢谢你们的回答/评论。现在我意识到我对这个话题知之甚少。再次感谢你!我更喜欢使用.then promise方法,而不是来自Deferred的原始addCallback等方法。然后你就可以用很多简洁的方式来写东西了。@missingno我以前是从Dojo1.2开始的。然后可能是1.4了吧?。我只是没有养成使用它的习惯,因为我没有完全用更新的1.5+代码完成一个大型项目。实际上,您也可以使用addCallback、addErrback等链接回调,尽管它们的行为有些不同,而且区别很重要。在国际海事组织,最好是学习新的方式与承诺向前迈进。另见:哇!谢谢你们的回答/评论。现在我意识到我对这个话题知之甚少。再次感谢你!异步代码要求您更加小心。您需要通过load、addCallback或then显式链接回调,以便对操作进行排序,并且您不能假设在相应的函数调用返回后执行IO操作。xhrGet是异步的,因为您没有显式将其设置为synchronous,因此,Ajax调用直到函数getActivityObj完成后才会发出——因为JavaScript是单线程的。Xhret不执行Ajax调用,它在函数返回后立即安排Ajax调用。因此,在这个函数块结束之前,ajaxResponse总是空的。是的,现在在阅读了答案和注释之后,我终于明白了异步/同步的含义。异步代码要求您更加小心。您需要通过load、addCallback或then显式地链接回调,以便对操作进行排序,并且您不能假设IO操作是在相应的函数调用返回后完成的。Xhret是异步的,因为您没有显式地将其设置为synchronous,所以Ajax调用可以
因为JavaScript是单线程的,所以在函数getActivityObj完成之前,它不会退出。Xhret不执行Ajax调用,它在函数返回后立即安排Ajax调用。因此,在这个函数块结束之前,ajaxResponse总是空的。是的,现在在阅读了答案和注释之后,我终于理解了异步/同步的含义。