2017-04-20 179 views
1

我有節點項目。 根文件是index.js和文件helper.js,在這裏我有一些幫助功能,它導入到index.js。 我想獲取一些數據,使用helper.js中的函數,但是當我在index.js中調用它時,它將返回undefined。 但在helper.js以上是可以的,console.log顯示我需要的數據。 我該如何解決這個問題?返回值時未定義

index.js文件內容:

const helper = require('./helper'); 

let data = helper.getData(); 
console.log(data); // undefined 

helper.js文件內容:

const fs = require('fs'); 

module.exports = { 
    getData:() => { 
    fs.readFile('data.json', 'utf8', (err, data) => { 
     const allData = JSON.parse(data); 
     console.log(allData); // IS OK! 
     return allData; 
    }); 
    } 
} 
+1

歡迎來到異步功能的奇妙世界 – George

+0

看看這個主題http://stackoverflow.com/questions/20647346/simple-nodejs-callback-example-with-fs-readfile – Leguest

+0

使用promise來獲取對象 – Tushar

回答

5

您可以使用Promise

const fs = require('fs'); 

module.exports = { 
    getData:() => { 
    return new Promise(function(resolve, reject){ 
     fs.readFile('data.json', 'utf8', (err, data) => { 
      if(err){ 
       reject(err); 
      } else { 
       try { 
        resolve(JSON.parse(data)); 
       } catch(ex){ 
        reject(ex); 
       } 
      } 
     }); 
    }); 
    } 
} 

然後:

helper.getData().then(function(data){ 
    console.log(data); 
}, function(err){ 
    // here something failed 
}); 

問題是fs.readFile方法是異步的,不會給你任何數據結果check the documentation here

那麼一種選擇是使用Promise像我一樣,或者使用callback作爲@Tatsuyuki石的回答表明,你可以查看callback實施文檔。

+4

完美髮布代碼我懶得寫 – Aron

+0

我刪除了我的評論後,你的答案,懶得寫一個承諾;) – Tushar

+0

我不想打擾任何人,但恕我直言,這是一個非常糟糕的答案,因爲它只提出了一個解決方案,但並沒有用一個單詞來解釋潛在的問題。而且,所示的解決方案只是一個更多的任意一個 - 爲什麼我應該使用承諾?我也可以用回叫,例如 –

2

問題是fs.readFile是一個異步函數,所以不會返回任何東西。

如果你確實需要它返回的東西,你可以使用同步版本,fs.readFileSync

否則 - 和更好的方式來做到這一點 - 將有getData回報promise然後你可以用resolveallData

1

readFile是一個異步函數,它接受回調。你有兩種選擇:

1。獲取回調作爲getData()中的參數。

getData: (callback) => { 
    fs.readFile('data.json', 'utf8', (err, data) => { 
     const allData = JSON.parse(data); 
     console.log(allData); // IS OK! 
     callback(allData); 
    }); 
    } 

2。使用同步版本。

getData:() => { 
    var data = fs.readFileSync('data.json', 'utf8'); 
    const allData = JSON.parse(data); 
    console.log(allData); // IS OK! 
    return allData;   
    } 

當然,你可以用承諾這是對鏈接的東西更漂亮,但它往往與像Bluebird依賴使用。

1

問題是,您從回調函數返回allData,而不是getData函數。並且因爲getData沒有明確的return,所以您的helper.getData()函數將返回undefined並且將打印此值而不是您想要的值。

我建議使用Promise正確返回數據,就像@ sand的答案一樣。