Нужна помощь с функцией Extjs, возвращающей неопределенные результаты - PullRequest
0 голосов
/ 05 августа 2010

Я хочу сделать следующее с моим кодовым блоком 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);  
    }  
}    

Ответы [ 2 ]

0 голосов
/ 05 августа 2010

Для предотвращения такого рода предупреждения, используйте функцию return значение во всех случаях, или ни одного случая.На данный момент вы возвращаете значение только в одном if случае;другие дела не вернут ничего.Вы можете даже return undefined, чтобы предупреждение исчезло.Однако то, что он говорит вам, правильно: функция, которая иногда имеет возвращаемое значение, а иногда нет, немного странная и предполагает, что вы делаете что-то не так.

То, что вы, похоже, хотите сделатьЕсли внутренний метод return в методе success возвращает значение из метода detect(). Это абсолютно невозможно. Внутренняя функция может возвращать только значение вызывающей стороне success, которая является самим Prototype.К тому времени, когда это происходит, метод detect() уже давно вернулся.

Здесь у вас есть асинхронный код.Метод detect() может настроить запрос AJAX, но затем он должен немедленно вернуться к своему вызывающему, который вернет управление браузеру.Через некоторое время HTTP-запрос после AJAX-вызова завершится, и , а затем сработает функция 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);
                ...
            },
            ...
        });
    },
    ...
 };

(Iубрал лишнюю пару Ext.encode -> Ext.decode, которая кажется пустой тратой времени.)

0 голосов
/ 05 августа 2010

Во-первых, ваш метод обнаружения не вернет значение и вернется немедленно (даже до завершения вызова 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);  
    }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...