2017-04-08 23 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。基本的にコールバックのように動作しますが、やや柔軟性があり、連鎖が容易になります。

関連する問題