异步等待JSON解析未等待

F. *_*kes 2 arrays json node.js async-await

我在async/await不等待上一个声明时遇到了问题。我正在尝试读取JSON文件,然后尝试操纵结果对象。尽管有一个数组,但它在执行下一个功能时仍未定义await

function initJson(file) {
  let obj;
  fs.readFile(file, 'utf8', (err, data) => {
  if (err) {
    throw err;
  }
  try {
    const obj = JSON.parse(data);
    console.log(obj);
   }
   catch (err) {
     throw err;
   }
 });
 return obj;
};

filterItemForKeyValue = function filterItemForKeyValue(obj, k, v) {
  if (typeof obj !== 'undefined' && obj) {
    return obj.filter(item => item[k] !== v);
  }
  return false;
};

async function handleFavorites(file) {
  let favorites = await initJson(file);
  favorites = await filterItemForKeyValue(favorites, 'delete', true);
  // here it's already false because favorites is undefined because it didn't wait

  console.log(favorites);
  return favorites;
};

let favs = handleFavorites('test.json');
console.log(favs);
Run Code Online (Sandbox Code Playgroud)

Win*_*Win 5

initJson没有使用Promise,因此您无法等待响应。initJson通过返回承诺(如下面的示例)进行修改。

function initJson(file) {
    return new Promise((resolve, reject) => {
        fs.readFile(file, 'utf8', (error, data) => {
            if (error) {
                reject(error);
            }
            resolve(JSON.parse(data));
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

filterItemForKeyValue为您转换:

var filterItemForKeyValue = function filterItemForKeyValue(object, key, value) {
    return new Promise((resolve, reject) => {
        try {
            if (typeof object !== 'undefined' && object) {
                resolve(object.filter(item => item[key] !== value));
            }
        } catch (error) {
            reject(false);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

答案中提供的更改之后,这就是您与结果交互的方式。

handleFavorites('test.json').then((result) => {
  console.log(result);
});
Run Code Online (Sandbox Code Playgroud)

承诺:https//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

异步功能:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function