我想用我的javascript代码块执行以下操作。
问题
非常感谢任何帮助
谢谢!
以下代码:
这就是我调用当前方法的方法
//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 :(得分: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
对,这似乎是浪费时间。)