鍍金池/ 問(wèn)答/Java  HTML/ node.js 導(dǎo)出異步結(jié)果怎么處理

node.js 導(dǎo)出異步結(jié)果怎么處理

  1. 項(xiàng)目要上devops,之前通過(guò)配置文件獲取項(xiàng)目的配置項(xiàng),現(xiàn)改為從配置中心拉取配置項(xiàng),將之前的配置文件同步加載修改為通過(guò)接口獲取etcd中的配置項(xiàng),發(fā)現(xiàn)無(wú)法將異步獲取的結(jié)果導(dǎo)出?

代碼如下:

# 修改前的代碼
var baseConfigFilePath      = '../base-config.yaml';  // 基礎(chǔ)配置文件路徑
var customConfigFilePathEnv = 'CONFIG_PATH';  // 自定義配置文件路徑環(huán)境變量名

var loadFile = exports.loadFile = function loadFile() {
  var baseConfigFileFullPath = path.join(__dirname, baseConfigFilePath);
  var customConfigFilePath   = process.env[customConfigFilePathEnv];


  var fileData, obj;



  /* 讀取基礎(chǔ)配置文件 */
  fileData = fs.readFileSync(baseConfigFileFullPath);
  obj = yaml.load(fileData);

   // 使用自定義配置覆蓋基礎(chǔ)配置
  if (!toolkit.isNullOrWhiteSpace(customConfigFilePath)) {
    var customFileData = fs.readFileSync(customConfigFilePath);
    var customObj = yaml.load(customFileData);
    
    // 覆蓋基礎(chǔ)配置文件
    toolkit.objUpdate(customObj, obj);
  }

  exports.CONFIG = obj;
};

loadFile();

修改后

var loadFile = exports.loadFile = function loadFile() {
  var baseConfigFileFullPath = path.join(__dirname, baseConfigFilePath);
  var customConfigFilePath   = process.env[customConfigFilePathEnv];

  var fileData, obj;


  /* 讀取基礎(chǔ)配置文件 */
  fileData = fs.readFileSync(baseConfigFileFullPath);
  obj = yaml.load(fileData);

  // 使用自定義配置覆蓋基礎(chǔ)配置
  if (!toolkit.isNullOrWhiteSpace(customConfigFilePath)) {
    // var customFileData = fs.readFileSync(customConfigFilePath);
    // var customObj = yaml.load(customFileData);
    request(customConfigFilePath, function(error, response, data) {
      if (error) {
        console.log('配置中心', colors.red('獲取配置失敗'));
      }
      var resData = JSON.parse(data);

      if (resData.errorCode) {
        console.log('配置中心', colors.red('獲取配置失敗'));
      }

      var customObj = toolkit.fromBase64(resData.node.value);
      toolkit.objUpdate(customObj, obj);
    })
  }

  exports.CONFIG = obj;
};

exports是同步處理的方式,無(wú)法導(dǎo)出etcd獲取的數(shù)據(jù),在保持源碼大致邏輯不變的情況下,怎么處理該問(wèn)題?

回答
編輯回答
生性

1,把request搞成同步的
2,我是這么想的:
module:test1.js

module.exports = new Promise((resolve, reject) => {
    setTimeout(() => { resolve("asd"); }, 1000);
});

app.js

(async () => {
    let a = await require("./test1");
    console.log(a);
})();
2017年10月20日 18:31
編輯回答
下墜

exports一個(gè)Promise,至于外部是promise.then也好是async/await也好那是外部的事。

其次,個(gè)人認(rèn)為這里配置中心的侵入太強(qiáng)了,會(huì)影響太多的進(jìn)程,個(gè)人認(rèn)為在配置中心配套agent只做配置文件同步就好了(或者其他功能擴(kuò)展也放這,盡量與服務(wù)無(wú)關(guān)),讀取還是本地,這樣不至于配置中心掛了所有服務(wù)都沒(méi)法啟動(dòng)。

2017年9月16日 01:08