繁体   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