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)
您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