2013-05-12 3 views
-1

자바 스크립트에서 sqlite 쿼리의 데이터를 반환하고 싶습니다. 다음 문제는 :함수 내의 함수에서 데이터를 반환합니다.

 App.dbInstantion.transaction(function(tx){ 
       tx.executeSql('SELECT * FROM footsteps', [], 
        function(tx, results) { 
         for (var i = 0; i < results.rows.length; i++) { 
           footsteps.push(results.rows.item(i)); 
          } 
          //WRONG RETURN SCOPE 
          return footsteps; 

        }, self.errorCB 
       ); 
      }, self.errorCB); 

      //FOOTSTEPS IS NOT FILLED YET SO AN EMPTY ARRAY IS RETURNED 
      return footsteps; 

내가 $.Deferred을 사용하려고하지만 문제가 해결되지 않았다. 누구든지 이것에 대한 제안이 있습니까?

안녕하세요,

+0

[AJAX 호출의 응답을 반환하는 방법] (http://stackoverflow.com/q/14220321/218196)을보십시오. Ajax가 아니더라도 솔루션은 동일합니다. 지연된 객체/약속이 작동하지 않으면 잘못 사용했습니다. –

+0

제안 해 주셔서 감사합니다. –

답변

0

실제로 지연된 개체를 사용할 수 있습니다. 지연된 객체를 만들고 관심있는 코드를 들어 봅니다. 그런 다음 작업을 수행하십시오. 작업이 완료되면 지연된 개체를 분석하여 데이터를 전달합니다. 해당 지연된 모든 리스너는 해결하는 동안 데이터를 수신합니다.

1

나는 접근법이 잘못되었다고 말할 것이다.

여기에 데이터를 반환하는 것은 의미가 없습니다. 아마도 당신이하고 싶은 것은 "발걸음"을 바깥 기능에 넘기는 것입니다. 그러나 내부 함수가 실행될 때까지 외부는 이미 끝났습니다. 발걸음으로 무엇을하고 싶든, 내부 기능에서 수행해야합니다. 외부 함수가 이미 완료되었지만 외부 함수의 컨텍스트에서 정의 된 모든 변수에 여전히 액세스 할 수 있습니다. 아마 이것은 도움이 될 것입니다.

콜백 및 종료에 대해 읽어보십시오. 내가 추천 할 수있는 콘텐츠는 O'Reilly의 "JavaScript Patterns"또는 Douglas Crockford의 콘텐츠입니다.

0

이 내가 그것을 알아 낸 방법입니다

functionName: function(callback, param1, param2) { 
      var self = this; 
     var data = function getData(){ 
      var dfd = $.Deferred(); 
      App.dbInstantion.transaction(function(tx){ 
       tx.executeSql('SELECT * FROM blabla', 
        [], dfd.resolve, self.errorCB 
       ); 
      }, self.errorCB); 

      return dfd.promise(); 
     } 

     //return deferred is done(.then) function with the sent callback to this function 
     return data().then(callback); 
    }, 

가 그럼 난 이렇게 사용 :

우선 함수 자체는, 내가이 Defferred의 그 때는 어린 아이 PAS하는 콜백을 받아 :

initialize: function() { 
      functionName(this.passedCallback); 
}, 


passedCallback: function(tx, results) { 
// I got the results of the query here! 
        window.footsteps = []; 

       for (var i = 0; i < results.rows.length; i++) { 
        window.footsteps.push(results.rows.item(i)); 
       } 

       //trigger backbone custom event to deal with async problems 
       App.Vent.trigger('retrievingFootsteps:done'); 
      }, 
관련 문제