簡體   English   中英

需要Extjs函數返回未定義結果的幫助

[英]Need help with Extjs function returning undefined results

我想對我的JavaScript代碼塊執行以下操作。

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

首先,您的detect方法將不會返回值,而是會立即返回(即使在ajax調用完成之前),因為ajax調用是異步的

其次,在成功處理程序中沒有返回值的意義。 相反,您應該為您的detect方法提供一個回調函數,如下所示:

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

為避免這種警告,請在所有情況下(或不執行任何情況)使函數return一個值。 目前,您只返回一個if情況下的值; 其他情況不會返回任何內容。 您甚至可以return undefined來消除警告。 但是,它告訴您的信息是正確的:有時具有返回值而有時沒有返回值的函數有點怪異,並建議您做錯了什么。

您似乎想做的是在success方法中具有內部return值,該值從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對,這似乎是在浪費時間。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM