从promise中的.then()返回一个值?

时间:2017-09-28 19:07:20

标签: javascript json node.js asynchronous fs

我试图将文件读作JSON,操纵JSON,然后将操纵的JSON返回到flatten函数。以下是我的承诺和我的扁平化功能。

无极

const fs = require('fs');

module.exports = (filePath) => {
  return new Promise((fulfill, reject) => {
    fs.readFile(filePath, 'utf8', (err, res) => {
      if (err) reject(err);
      else fulfill(res);
    });
  });
};

拼合功能

 flatten: (baseLoc, filePath, updateRev) => {
return readFilePromise(filePath)
    .then((data) => {
      const jsonObject = Object.assign({}, data);
      const flatJson = flattener(jsonObject, baseLoc);
      if (flatJson.$meta) {
        delete flatJson.$meta;
      }
      if (updateRev === true || updateRev === 'true') {
        flatJson.id = incrementVersion(flatJson.id);
      }
      return flatJson;
    })
    .catch(err => err);
}

我在回复承诺时得到了{}。如果我没有返回promise,而是依赖于return flatJson语句,我会得到未定义的。我不确定为什么会发生这种情况,因为从我在StackOverflow / Google上看到的所有内容来看,我的所有内容都是正确的。

奇怪的是,如果我通过代码调试,我可以看到返回的flatJson语句实际上保存了我正在寻找的值,它只是当另一个函数调用flatten函数时,我最终未定义或{}。

1 个答案:

答案 0 :(得分:0)

您只能在异步上下文中使用await关键字以同步方式获取异步函数的结果,如下所示:

async function getResultDirect(req, res) {
  let result = await flatten(baseLoc, filePath, updateRev);
  return result;
}

但是这只是将异步性隐藏在堆栈中的一个级别。别无他法。