需要帮助Extjs函数返回未定义的结果

时间:2010-08-05 07:43:35

标签: javascript ajax extjs

我想用我的javascript代码块执行以下操作。

  1. 处理所有当前和新设备请求,即。检测,加密,解密等
  2. 将结果返回给调用方法
  3. 问题

    1. 如何改进现有代码并摆脱javascript严格警告:匿名函数并不总是返回值。
    2. 调用我方法的正确方法是什么?
    3. 非常感谢任何帮助

      谢谢!

      以下代码:

      这就是我调用当前方法的方法

      //Contents of SmEditor.js
      var response = Ext.decode(Prometheus.DeviceRequestHelper.detect(request_id));  
      
      
      //contents of Sm.js
      Ext.ns('myApp') 
      myApp.DeviceRequestHelper = {  
          detect:function(request_id){  
              var task = function(){  
              Ext.Ajax.request({  
                  url: 'device_requests.php',  
                  params:{  
                      action:'get_device', //in php  
                      'request_id':request_id  
                      },  
                  timeout:30000, //30 seconds  
                  success:function(response){//serverside response  
                      var result = Ext.decode(response.responseText); //convert to js objects  
                      if(result.success == true){//device was detected  
                          cons.log('success,device was detected');  
                          cons.log(result);  
                          Ext.TaskMgr.stop(runTask);  
                          return Ext.encode(result); //javascript strict warning  
                      }else{  
                          if(runTask.taskRunCount >= 10){  
                              //retry limit exceeded  
                              Ext.Msg.show({  
                                  title:'Server Failure',  
                                  msg:"Detection Failed,Unable to detect device",  
                                  icon: Ext.MessageBox.ERROR,  
                                  buttons: Ext.Msg.OK  
                              });  
                              Ext.MessageBox.getDialog().getEl().setStyle('z-index','80000');  
                              Ext.TaskMgr.stop(runTask);  
                          }  
                      }  
                  },  
                  failure:function(response){  
                      Ext.TaskMgr.stop(runTask);  
                      Ext.Msg.show({  
                          title:'Server Failure',  
                          msg:"Failed, server communication error",  
                          icon: Ext.MessageBox.ERROR,  
                          buttons: Ext.Msg.OK  
                      });  
                      Ext.MessageBox.getDialog().getEl().setStyle('z-index','80000');  
                  }  
              })  
              }
              var runTask = {  
                  run: task,  
                  interval:2000,  
                  repeat:10  
                  };  
              Ext.TaskMgr.start(runTask);  
          }  
      }    
      

2 个答案:

答案 0 :(得分:0)

首先,您的detect方法不会返回值并立即返回(甚至在ajax调用完成之前),因为ajax调用是异步的

其次,在成功处理程序中返回值是没有意义的。相反,你应该为你的检测方法提供一个回调函数,如下所示:

Ext.decode(Prometheus.DeviceRequestHelper.detect(request_id, function(response) {
      // do something with your response
}));

// detect function takes a callback function as a parameter
myApp.DeviceRequestHelper = {  
    detect:function(request_id, funCallback){  // pass in a callback function that is
                                               // called when result was a success
        var task = function(){  
           Ext.Ajax.request({  
               url: 'device_requests.php',  
               params:{  
                   action:'get_device', //in php  
                   'request_id':request_id  
                   },  
               timeout:30000, //30 seconds  
               success:function(response){//serverside response  
                   var result = Ext.decode(response.responseText); //convert to js objects  
                   if(result.success == true){//device was detected  
                       cons.log('success,device was detected');  
                       cons.log(result);  
                       Ext.TaskMgr.stop(runTask);  
                       // return Ext.encode(result); //javascript strict warning
                       funCallback(Ext.encode(result)); // ===========> callback function called.
                   }else{  
                       if(runTask.taskRunCount >= 10){  
                           //retry limit exceeded  
                           Ext.Msg.show({  
                               title:'Server Failure',  
                               msg:"Detection Failed,Unable to detect device",  
                               icon: Ext.MessageBox.ERROR,  
                               buttons: Ext.Msg.OK  
                           });  
                           Ext.MessageBox.getDialog().getEl().setStyle('z-index','80000');  
                           Ext.TaskMgr.stop(runTask);  
                       }  
                   }  
               },  
               failure:function(response){  
                   // ... failure handing code  
               }  
           });  
        }
        var runTask = {  
            run: task,  
            interval:2000,  
            repeat:10  
            };  
        Ext.TaskMgr.start(runTask);  
    }  
}

答案 1 :(得分:0)

要防止出现此类警告,请在所有情况下使用return函数值,或者不使用任何情况。目前,您只返回一个if案例中的值;其他情况不会返回任何内容。您甚至可以return undefined发出警告消失。但是,它告诉你的是正确的:一个有时具有返回值但有时没有返回值的函数有点奇怪,并暗示你做错了。

您似乎想要做的是让return方法中的内部success返回detect()方法中的值。 这绝对不可能。内部函数只能向success的调用者返回一个值,这是Prototype本身。到这种情况发生时,detect()方法早已返回。

这里有异步代码。 detect()方法可以设置一个AJAX请求,但必须立即返回其调用者,调用者将控制返回给浏览器。稍后,AJAX调用后面的HTTP请求将完成,然后 success函数将被触发。 JavaScript无法同步调用异步代码,反之亦然。

您需要做的是将回调函数传递给您的方法,然后在完成时将其回调:

Prometheus.DeviceRequestHelper.detect(request_id, function(response) {
    // do something with `response`
});

myApp.DeviceRequestHelper= {  
    detect: function(request_id, callback) {
        ...
        Ext.Ajax.request({
            ...
            success: function(xhr) {
                var result= Ext.decode(xhr.responseText);
                if (result.success)
                    callback(result);
                ...
            },
            ...
        });
    },
    ...
 };

(我删除了额外的Ext.encode - > Ext.decode对,这似乎是浪费时间。)