2010-08-05 48 views
0

我想用我的javascript代码块来完成以下操作。需要Extjs函数帮助返回未定义的结果

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

问题

  1. 我怎样才能改善现有的代码,并摆脱了JavaScript的严格的警告:匿名函数并不总是返回一个值。
  2. 什么是调用我的方法的正确方法?

任何帮助是极大的赞赏

谢谢!

。由此代码:

这是我如何调用当前方法

//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); 
    } 
}  

回答

0

为了阻止这种警告的,具备的功能return在所有情况下的值,或没有的情况下。目前你只能在一个if的情况下返回一个值;其他情况下不会返回任何东西。您甚至可以使return undefined使警告消失。但是,它告诉你的是正确的:一个函数有时具有返回值,有时不会有点奇怪,并表明你做错了什么。

你似乎想要做的是success方法中的return的内部方法从detect()方法返回一个值。 这是绝对不可能的。内部函数只能将值返回给原型本身success的调用者。在发生这种情况时,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对,这似乎只是一种浪费)

+0

太棒了!感谢您花时间回答我的问题。在将问题标记为已回答之前,我会执行更改并测试代码。再一次,谢谢! – QCar 2010-08-05 08:52:12

+0

发表你用来调用'detect()'...的代码你确定'function(){...}'在方括号内作为第二个参数吗? – bobince 2010-08-05 09:58:58

+0

谢谢!已解决我忘了将函数()放在括号中。 我得到我想要的输出:) – QCar 2010-08-05 10:07:46

0

首先,你的检测方法将不会返回一个值,并会立即返回(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); 
    } 
} 
+0

感谢您的回答,很明显,您和bobince对使用回调函数达成了一致意见.Bobince为我详细解释了为什么我的代码无法正常工作。 – QCar 2010-08-05 08:57:13