[英]Need help with Extjs function returning undefined results
我想對我的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);
}
}
首先,您的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.