Brauchen Sie Hilfe mit Extjs-Funktion die Rückgabe undefiniert Ergebnisse
Ich will im folgenden mit meinem javascript-codeblock.
- Verarbeiten alle aktuellen und neuen device-requests, dh. erkennen,verschlüsseln,entschlüsseln,usw.
- Das Ergebnis an die aufrufende Methode
Fragen
- Wie kann ich den vorhandenen code und loszuwerden des javascript strict-Warnung:anonym-Funktion nicht immer einen Wert zurück.
- Was ist der richtige Weg, der Aufruf meiner Methode?
Jede Hilfe wird sehr geschätzt
Dank!
Hiermit den code:
Dies ist, wie rufe ich die Methode, die derzeit
//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);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um zu verhindern, dass diese Art von Warnung, die Funktion
return
einen Wert in allen Fällen oder nicht Fällen. Im moment sind Sie nur die Rückgabe eines Wertes in eineif
Fall; die anderen Fälle wird nicht wieder alles. Sie können sogarreturn undefined
um die Warnung Weg. Jedoch, was es sagt, ist richtig: dass eine Funktion, die manchmal einen Rückgabewert und manchmal nicht das ist ein wenig seltsam aus und schlägt dann machst du etwas falsch.Was Sie scheinen zu wollen, zu tun haben, ist die innere
return
imsuccess
Methode einen Wert zurückgeben von derdetect()
Methode. Das ist absolut nicht möglich. Die innere Funktion kann nur einen Wert an den Aufrufer dessuccess
, die Prototypen selbst. Durch die Zeit dies geschieht, ist diedetect()
Methode hat sich längst zurückgegeben.Was Sie hier haben, ist der asynchrone code. Die
detect()
Methode können einen AJAX-request, aber es muss dann wieder sofort an den Aufrufer zurückgeben wird, die Kontrolle an den browser. Einige Zeit später, die HTTP-Anforderung, die hinter der AJAX-Aufruf wird abgeschlossen, und dann diesuccess
Funktion ausgelöst wird. JavaScript nicht aufrufen asynchroner code synchron, oder Umgekehrt.Was Sie tun müssen, ist, übergeben Sie eine callback-Funktion in Ihrer Methode, und rufen Sie dann zurück auf Fertigstellung:
(Ich entfernte den extra
Ext.encode
->Ext.decode
paar, das nur scheint wie eine Verschwendung von Zeit.)detect()
... sind Sie sicher, dass diefunction() {...}
ist innerhalb der eckigen Klammern als zweites argument?Zuerst, Ihre Erkennung wird die Methode keinen Wert zurück und wird sofort wieder(sogar vor dem ajax-Aufruf abgeschlossen ist), weil der ajax-Aufruf ist asynchron
Zweiten, gibt es keinen Punkt gibt einen Wert zurück in Ihre Erfolgs-handler. Stattdessen müssen Sie eine callback-Funktion, um Ihre Methode erkennen, zum Beispiel so: