Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从承诺中的.then()返回值?_Javascript_Json_Node.js_Asynchronous_Fs - Fatal编程技术网

Javascript 从承诺中的.then()返回值?

Javascript 从承诺中的.then()返回值?,javascript,json,node.js,asynchronous,fs,Javascript,Json,Node.js,Asynchronous,Fs,我试图将一个文件读取为JSON,操纵JSON,然后将操纵后的JSON返回给flatte函数。下面是我的承诺和我的展平功能 承诺 const fs = require('fs'); module.exports = (filePath) => { return new Promise((fulfill, reject) => { fs.readFile(filePath, 'utf8', (err, res) => { if (err) reject(e

我试图将一个文件读取为JSON,操纵JSON,然后将操纵后的JSON返回给flatte函数。下面是我的承诺和我的展平功能

承诺

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语句实际上保存了我要查找的值,只是当另一个函数调用flatte函数时,我得到了一个未定义的或{}

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

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

但这只是将异步性隐藏了一层。没有其他办法。

无论你在这方面做了多少承诺,你永远都不会得到
展平
来返回展平的结果。它将返回一个承诺,或者接受稍后调用的回调,并返回结果。您如何调用它?类似于
flatte(…).then(JSON.stringify).then(send)
?@Bergi我从一个单独的文件调用它,名为
app.flatte(params)
,我是否需要将flatte设置为承诺,以便使用您提供的语法?我对承诺还比较陌生,如果这些都是noob,我很抱歉questions@KevinB我是否也需要将
展平
设置为承诺?如何使用我想要返回的数据?我对承诺比较陌生,他们对我有点苛刻。@Steve你发布的代码应该能做到这一点。