变量未在节点中存储Promise结果



我正在开发一个与API连接的脚本,然后使用JSON响应执行一些操作,然后重新格式化JSON以将其发送到另一个API。

但现在我被困在了第一步,因为我无法处理第一部分,因为我的承诺没有像预期的那样发挥作用。如何将API的响应存储到变量中?为了开发目的,我将一个API响应存储到JSON文件中。这是我的代码:

declare var require: any;
let url = './data/big buy/big-bui-product-list.json';
const fs = require('fs'); 
let counter = 0;

const getProductList = () => {
return new Promise((resolve, reject) => {
fs.readFile(url, 'utf8', (err, data) => {
if(err){
return reject (err);
}
else {
return resolve(JSON.parse(data));
}
})
})
}
const getProductStock = () => {
return new Promise((resolve, reject) => {
fs.readFile('./data/big buy/big-bui-product-stock.json', 'utf8', (err, data) => {
if(err) {
return reject(err);
}
else {
return resolve(JSON.parse(data));
}
})
})
}

try {
let products;
console.log('Products:');
Promise.all([getProductList()])
.then(function(result) {
products = result[0];
});    

console.log('Stocks:');
const productStock = Promise.all([getProductStock()]);

console.log(products);

}
catch(e) {
console.log((`Ha ocurrido un error: ${e.message}`));
}
finally {

}

在这段代码中,我所做的是获得一个产品列表,然后获得所有产品的库存,稍后我将添加一个新函数,该函数将按库存进行过滤,并获得一个库存大于X单位的产品列表。现在,当我从终端启动它时,我不会将响应存储到products变量中,但如果我将.then((data) => console.log(data))添加到Promise中,我会在屏幕上看到JSON,但由于我没有将其存储在任何变量中,我不知道如何处理我正在检索的对象。

承诺是异步的。它们实际上是承诺未来会产生价值。当您执行getProductList().then(x => products = x)时,您是说Javascript应该在后台提取产品列表,并且一旦完成,它应该将products变量设置为x。这里的关键词是";在背景中";,因为在获取产品列表时,之后的代码一直在运行products变量仅保证在.then部分运行之后设置。因此,您可以将内容移动到.then:

try {
let products;
getProductList().then(list => {
products = list;
return getProductStock(); // leverage promise chaining
}).then(stocks => {
console.log("Products:", products);
console.log("Stocks:", stocks);
}); 
}
catch(e) {
console.log((`Ha ocurrido un error: ${e.message}`));
}
finally {

}

您似乎缺少一些关于承诺的基本知识。我建议您阅读MDN使用Promises指南,以熟悉它们。

像下面这样的结构永远不会起作用。

let variable;
promise.then(data => variable = data);
console.log(variable);

这是因为它以以下方式执行。

  1. 创建变量variable
  2. 向承诺添加承诺处理程序
  3. 记录variable
  4. 承诺得到解决
  5. 执行promise处理程序。
    1. 将变量variable设置为data

如果你使用Node.js10或更高版本,你可以使用文件系统的promise API来简化你的代码。

const fs = require('fs/promises');
const readJSON = (path) => fs.readFile(path, "utf8").then((json) => JSON.parse(json));
const getProductList = () => readJSON("./data/big buy/big-bui-product-list.json");
const getProductStock = () => readJSON("./data/big buy/big-bui-product-stock.json");
Promise.all([
getProductList(),
getProductStock(),
]).then(([products, stocks]) => {
console.log({ products, stocks });
}).catch((error) => {
console.log("Ha ocurrido un error:", error.message);
}).finally(() => {
// ...
});

最新更新