2017-04-08 1 views
0

node.js를 배우고 있는데 문제가 있습니다. 함수에서 변수로 데이터를 가져 오는 방법은 무엇입니까?함수에서 변수로 데이터를 가져 오는 방법

function loadOrInitializeTaskArray(file, cb) { 
     fs.exists(file, function(exists) { 
       var tasks = []; 
       if (exists) { 
        fs.readFile(file, 'utf8', function(err, data) { 
          if (err) throw err; 
          var data = data.toString(); 
          var tasks = JSON.parse(data || '[]'); 
          cb(tasks); 
        }) 
       } else { 
         cb([]); 
       } 
     }) 
} 



function listTasks(file) { 
     loadOrInitializeTaskArray(file, function(tasks) { 
       for (var i in tasks) { 
         console.log(tasks[i]); 
       } 
     }) 
} 

기능 listTasks이 제대로 작동하지만 나는 예를 들어 customListTasks를 들어, 자신의 함수를 만들 싶습니다

function customListTasks(file) { 
     var list = loadOrInitializeTaskArray(file, function(){}); 
     console.log(list); 
} 

이 나에게 오류를 반환하지,하지만 "정의되지 않은"저를 반환 목록에 CONSOLE.LOG. 이 데이터를 어떻게 변수 목록으로 가져올 수 있습니까?

+0

Bluebird 코 루틴 기능을 사용하면 약속을 낼 수 있습니다. –

+0

http://stackoverflow.com/questions/5010288/how-to-make-a-function-wait-until-a-callback-has-been-called -using-node-js –

+0

비동기 결과를 동 기적으로 가져올 수는 없습니다. 비동기 적으로 가져와야합니다 (콜백, 약속). – trincot

답변

0

짧은 대답 : 할 수 없습니다.

loadOrInitializeTaskArray의로드가 비동기 적이기 때문에 모든 마법은 전달중인 콜백에서 발생해야합니다. 당신은 그저 값을 '반환'할 수 없습니다.

옵션 1 :로드 된 데이터에 의존하는 모든 논리를 콜백으로 전달하는 익명 함수에 배치하십시오.

var list = loadOrInitializeTaskArray(file, function(tasks){ 
    console.log(tasks); 
}); 

옵션 2 : 사용 Promises. 본질적으로 콜백과 같이 작동하지만 약간 더 유연하고 쉽게 체인을 만들 수 있습니다.

관련 문제