2017-10-08 89 views
0

我一直無法學習來自同步編程語言的回調和承諾。我一直試圖讓.env文件的結果,這樣的話,我可以在我的應用程序中使用它,而是console.log(envdata)回報:BlueBird Promises的閱讀結果

Promise { 
    _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined, 
    _settledValue: undefined 
} 

在我的控制檯。我怎樣才能從文件中獲得正確的結果?

這是我目前的代碼。

'use strict'; 

var envdata = {}; 
var path = require('path'); 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(require('fs')); 

module.exports = function(app, options) { 

    return new Promise(function(resolve, reject){ 
      envdata = getenvdata(options.basedir + path.sep + ".env"); 
      console.log(envdata); //need this to be the data 
      app.envdata = envdata; 
      resolve(app); 
    }); 

    function getenvdata(path){ 
     return fs.readFileAsync(path, 'utf8') 
     .then(function(data){ 
      data.split("\n").forEach(function(keyvalue) { 
       var array = keyvalue.split('='); 
       array[1] && (data[array[0]] = array[1]); 
      }); 
      return data; 
     }); 
    } 
} 
+0

我認爲有承諾和異步調用之間的差異^ @ marvel308 – Albert

+0

@Albert沒有,實際上不是。 – Tomalak

+0

無論如何,我試圖找出如何讀取藍鳥承諾的結果,而不是實際的藍鳥承諾對象 – Albert

回答

1

要閱讀您必須將自己的諾言鏈諾言的價值getenvdata返回一個承諾(即,你必須註冊一個事件處理程序)。正如已經提到的,這通過0​​和其他Promise方法完成。

我對你的代碼有一些評論。

  • 首先,不使用new Promise()除非你promisfying非承諾異步函數,即一個依賴一種回調。這裏不是這種情況,所以應該避免使用new Promise()(這稱爲Explicit Promise Construction Anipattern)。 readFileAsync已經返回一個承諾,只是繼續使用該承諾。
  • 您自己的Promisifying函數本身就是您應該避免使用的功能,例如Bluebird的promisifyAll或節點的util.promisify
  • fs是一個核心模塊,你並不需要它。
  • 讀取文件的過程將文件拆分成行,然後分解爲鍵和值,可以實現爲map-reduce操作,Bluebird實際上具有整潔的幫助器。
  • 最後但並非最不重要的,看看async/avait

考慮這個另類觀點:

'use strict'; 

var path = require('path'); 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(fs); 

module.exports = function(app, options) { 
    return fs.readFileAsync(path.join(options.basedir, ".env"), 'utf8') 
     .then(data => data.split("\n")) 
     .map(line => line.split('=')) 
     .filter(keyval => keyval[1] > '') 
     .reduce((obj, keyval) => { obj[keyval[0]] = keyval[1]; return obj;}, {}); 
    }); 
} 

最後一步從文件條目創建一個鍵值對象。在ES6中編寫這個的另一種方法可以看到over here

使用

var readEnvAsync = require('readEnvAsync'); 

readEnvAsync().then(env => { 
    // ... 
}); 
+0

有趣的關於實用函數的鏈接,我用它在我的代碼。感謝您的額外信息。我現在明白許諾會好很多。 – Albert

+0

他們可以派上用場,這是Bluebird的一個非常棒的功能。 – Tomalak

1

,所以你需要使用then功能來收集你的結果是這樣

return new Promise(function(resolve, reject){ 
      getenvdata(options.basedir + path.sep + ".env").then(function(envdata){ 
      console.log(envdata); //need this to be the data 
      app.envdata = envdata; 
      resolve(app); 
     }) 
    }); 
+1

謝謝,現在我知道他們是如何工作的。非常感謝 – Albert

+0

@Albert這正是重複問題的含義。 – str

+0

@str我的壞,我只是認爲承諾不像回調 – Albert