2012-03-20 4 views
0

저는 javascript를 처음 사용 했으므로이 해결책을 찾을 수 없습니다. 비슷한 질문을 읽었지만 그 문제가 내 문제와 같지 않은 것처럼 보였습니다.함수에서 '정의되지 않은'변수를 반환하십시오.

는이 코드로 script1이에서 메소드를 호출

function getNextPage(Pid) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [], 
        function(tx, results) { 
      nextp = parseInt(results.rows.item(0).NextPage); 
      //alert(nextp); 
      return nextp; 
     }, errorCB); 
    }, errorCBQuery); 
} 

내가 호출 된 함수에 경고-대화 상자를 사용하는 경우, 변수 : script2에서

function turnPage(){ 
    var current = window.now; 
    var nextpage = getNextPage(current); 
    alert(nextpage); 
} 

는 SQLite는 등이 nextp is 2입니다. 하지만 변수를 반환하면 'undefined'로 경고합니다. 또한 변수 등을 만들면 var nextp = 11; "db.transaction ..."및 return 끝의 return 문을 반환하면 2 대신 11이 반환됩니다.

함수가 처음 시작될 때 변수가 내부 함수로 보내지지 않았기 때문입니까? ? :)

어떻게해야할까요? 감사!

답변

1

JavaScript가 작동하는 방식을 모르겠지만 비동기 적으로 작동합니다. 따라서 alertturnPage으로 호출하지만 트랜잭션이 비동기로 실행되고 반환 값은 다른 범위에 있습니다. 대신 인수로 nextpnextp 전화 콜백을 반환하는 다음 getNextPage에 콜백 함수를 전달하는 시도 할 수 있습니다 :

function turnPage(){ 
    var current = window.now; 
    getNextPage(current, function (nextp) { alert(nextp); /* do whatever else you need to do */ }); 
} 



function getNextPage(Pid, cb) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [], 
        function(tx, results) { 
      nextp = parseInt(results.rows.item(0).NextPage); 
      cb(nextp); 
     }, errorCB); 
    }, errorCBQuery); 
} 
+0

Thans! (누군가이 코드를 사용하는 경우 경고에 오타가 있음, 경고 (nextpage) – TorK

+0

gah 대신 경고 (nextp)가 표시됨, 오 입력이 수정 됨 –

+0

@ user1255456 해결 된 경우 대답을 수락하는 것을 기억하십시오. 문제가 있습니다. –

0

외부 기능이 절대로 작동하지 않으면 언제든지 nextp을 반환합니다.

  1. 전역 변수를 만들고 거기에 nextp의 값을 저장하기 위하여려고하고있는 것을 (나는 생각한다)에 대한 두 가지 솔루션이 있습니다.
  2. 또 다른 콜백을 도입하여 nextp 값을 사용합니다 (예 : 새 링크 또는 기타 작성). 원하는 경우 코드를 다른 함수에 넣고 매개 변수로 getNextPage()에 전달하거나 가장 가까운 함수 (코드 예 : alert 호출 위치)에 코드를 직접 입력 할 수 있습니다.

콜백은 많은 JavaScript API의 비동기 특성을 처리하는 데 사용됩니다. 따라서 getNextPage()조차도 getNextPage()이 완료되면 해당 값이 없기 때문에 내부 쿼리의 값을 반환 할 수 없습니다.

어쨌든 가장 안쪽 기능에있는 return 문은 실제로 그 값을 수신 할 기능이 없으므로 삭제 될 수 있습니다.

0

지금이기 때문에, 코드 몇 가지 문제가있다.

  1. 자바 스크립트가 대부분 asynchronus이기 때문에, 코드 :

    nextpage = getNextPage(current); 
    alert(nextpage); 
    

    getNextPage()를 호출하지만이 이동하기 전에 응답을 기다리지 않습니다 때문에 경고가에서 바로 해고 될 것입니다 응답이 반환되고 할당되지 않은 경우 (가능성이 있음) nextpage은 정의되지 않습니다.

  2. 두 번째 문제는 외부 함수가 아무 것도 반환하지 않는다는 것입니다. 내부 함수에서 값을 반환하지만 외부 함수에서는 "걸린다". 한 가지 해결책은 함수에서 값을 반환하는 대신 전역 변수에 값을 할당하는 것입니다. 전역 변수가 할당 될 때까지 읽지 않도록 "비동기 문제"를주의해야합니다.

관련 문제