【问题标题】:Returning a value from a .then() in a promise?从承诺中的 .then() 返回一个值?
【发布时间】:2018-03-10 15:17:07
【问题描述】:

我正在尝试以 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);
}

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

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

【问题讨论】:

  • 无论你用多少promise-foo 包装它,你永远不会得到flatten 来返回扁平化的结果。它要么返回一个promise,要么接受一个回调,稍后调用结果。
  • 你怎么称呼它? flatten(…).then(JSON.stringify).then(send) 之类的东西?
  • @Bergi 我从一个单独的文件中调用它为app.flatten(params) 是否需要将 flatten 设置为承诺才能使用您提供的语法?我对承诺比较陌生,如果这些是菜鸟问题,我很抱歉
  • @KevinB 我还需要将flatten 设置为承诺吗?如何使用我想要返回的数据?我对 Promise 比较陌生,他们让我有点失望。
  • @Steve 您发布的代码应该可以做到这一点。

标签: javascript json node.js asynchronous fs


【解决方案1】:

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

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

但这只是将异步性隐藏在堆栈的下一级。没有别的办法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多