2010-08-05 89 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