2010-08-05 1 views
0

Je veux faire ce qui suit avec mon codeblock javascript.Besoin d'aide avec la fonction Extjs retournant des résultats non définis

  1. Gérez toutes les demandes de périphériques actuelles et nouvelles. détecter, chiffrer, déchiffrer, etc
  2. Retour le résultat à la méthode d'appel

Questions

  1. Comment puis-je améliorer le code existant et de se débarrasser du javascript avertissement strict: fonction anonyme ne renvoie pas toujours une valeur.
  2. Quelle est la bonne façon d'appeler ma méthode?

Toute aide est grandement appréciée

Merci!

Ci-joint le code:

Voilà comment j'appelle la méthode actuelle

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

Répondre

0

Pour éviter ce genre d'avertissement, ont la fonction return une valeur dans tous les cas, ou pas de cas. Pour le moment, vous ne renvoyez qu'une valeur dans un cas if; les autres cas ne retourneront rien. Vous pouvez même return undefined pour que l'avertissement disparaisse. Cependant, ce qu'il vous dit est correct: qu'une fonction qui a parfois une valeur de retour et qui parfois ne l'est pas est un peu étrange et suggère que vous faites quelque chose de mal. Ce que vous semblez vouloir faire est que le return intérieur de la méthode success renvoie une valeur de la méthode detect(). Ce n'est absolument pas possible. La fonction interne peut uniquement renvoyer une valeur à l'appelant de success, qui est le prototype lui-même. Au moment où cela se produit, la méthode detect() est revenue depuis longtemps.

Ce que vous avez ici est du code asynchrone. La méthode detect() peut configurer une requête AJAX, mais elle doit ensuite renvoyer immédiatement à son appelant, ce qui renverra le contrôle au navigateur. À un moment ultérieur, la requête HTTP derrière l'appel AJAX se terminera, et puis la fonction success se déclenchera. JavaScript ne peut pas appeler de code asynchrone de manière synchrone, ou vice versa.

Ce que vous devez faire est de passer une fonction de rappel dans votre méthode, puis le rappeler à la fin:

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

(j'ai enlevé le Ext.encode supplémentaire ->Ext.decode paire, qui semble juste comme un gaspillage de temps.)

+0

Super! Merci d'avoir pris le temps de répondre à ma question. J'appliquerai les changements et je testerai le code avant de répondre à la question. Encore une fois, merci! – QCar

+0

Post le code que vous utilisez pour appeler 'detect()' ... êtes-vous sûr que 'function() {...}' est dans les parenthèses comme deuxième argument? – bobince

+0

Merci !!! RESOLU j'ai oublié de mettre la fonction() entre les parenthèses. Je reçois la sortie que je voulais :) – QCar

0

D'abord, votre détection méthode ne retourne une valeur et renverra immédiatement (avant même l'appel ajax termine) car l'appel ajax est asynchrone

Deuxièmement, il est inutile de renvoyer une valeur dans votre gestionnaire de succès. Au lieu de cela, vous devez fournir une fonction de rappel à votre méthode détecter comme ceci:

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

Merci pour votre réponse, il est clair que vous et Bobince êtes d'accord sur l'utilisation d'une fonction de rappel. Bobine m'a donné une explication détaillée pourquoi mon code ne fonctionnera pas. – QCar