2010-08-05 4 views
0

자바 스크립트 코드 블럭으로 다음을 수행하고 싶습니다.정의되지 않은 결과를 반환하는 Extjs 함수에 대한 도움이 필요합니다.

  1. 모든 현재 및 새 장치 요청을 처리합니다. 즉, 익명 함수 : 등
  2. 반환 호출 방법과 결과

질문 내가 기존 코드를 향상시킬 수 있고, 자바 스크립트 엄격한 경고를 제거하는 방법

  1. , 해독, 암호화, 감지 항상 값을 반환하지는 않습니다.
  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); 
    } 
}  

답변

0

함수 return 모든 경우에 값, 또는 어떤 경우에이 경고의이 종류를 방지하기 위해. 현재로서는 하나의 값만 반환합니다. if 사례 다른 경우는 아무 것도 반환하지 않습니다. 경고를 없애려면 심지어 return undefined 수 있습니다. 그러나 당신에게 말하는 것은 정확합니다. 가끔씩 반환 값을 가지며 때로는 이상하지 않고 뭔가 잘못된 것을하는 함수입니다.

detect() 메서드에서 success 메서드의 내부 return을 반환하면됩니다. 이것은 절대 불가능합니다. 내부 함수는 프로토 타입 자체 인 success의 호출자에게만 값을 반환 할 수 있습니다. 이 때까지 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 쌍, 그건 그냥 낭비처럼 보인다)

+0

좋아요! 내 질문에 답변 해 주신데 대해 감사드립니다. 질문을 답변으로 표시하기 전에 변경 사항을 구현하고 코드를 테스트합니다. 다시 한번 감사드립니다! – QCar

+0

'detect()'를 호출하는 데 사용하는 코드를 게시하십시오. ...'function() {...} '이 (가) 두 번째 인수로 대괄호 안에 있는지 확인하십시오? – bobince

+0

감사합니다 !!! 해결 방법 괄호 안에 function()을 넣는 것을 잊어 버렸습니다. 내가 원하는 출력을 얻고 있습니다 :) – QCar

0

는 첫째, 귀하가 값을 반환하지 않습니다 즉시 반환 방법을 감지 (도 전에이 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); 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 귀하와 bobince가 콜백 함수 사용에 동의하고 있습니다 .Bobince가 내 코드가 작동하지 않는 이유에 대한 자세한 설명을 주셨습니다. – QCar

관련 문제