我怎样才能让自己访问链中先前承诺的已解决价值?



我在 express 中有一个路由,我想在其中执行一堆异步操作,然后在满足某些条件时向数据库添加一些数据。到目前为止,它看起来像这样(索引.js(:

router.post('/distributor/:id/upload', upload.single('file'), function 
(err,req, res, next ) { 
if (err) { 
console.log(req);
console.log(req.file);
console.error(err);
return res.sendStatus(500);
}
next()
}, function (req, res, next) {  
// console.log(req.file);
csv()
.fromFile(req.file.path)
.subscribe((json)=>{ 
// console.log(json)
return new Promise((resolve,reject)=>{
let product = new Item(json.Title); 
product.distributor_id = req.params.id 
product.SKU = json.SKU 
product.UPC = json.UPC 
product.Price = json.Price 
return resolve(product) 
}).then((product) => {
// console.log(product) 
//async request to external API
var productInfo = getPriceandASIN.getPriceandASIN(product.UPC) 
return productInfo
}).then((info) => {  
console.log(info) 
console.log(product) 
//a bunch of other stuff I don't need to worry about yet
// return res.end()
})
});
}) 

如果我只是控制台.log(info(,我会得到预期的响应,即为集合中的每个项目调用上一个异步函数的结果。但是,如果我也尝试控制台.log(产品(,整个功能就会中断,我只获取集合中第一项(而不是产品(的信息,没有其他信息。是什么导致了这种行为?我认为关于解决承诺,我从根本上不了解一些东西,但我无法从文档中看出什么。

在你调用console.log(product)的函数中没有要取消引用的"product"变量,所以编程的基础知识适用:如果你想访问一个东西,就让这个东西可访问。在这种情况下,使上一个处理程序return所需的所有数据。如果这是一个变量,则返回一个变量。如果是多个变量,则返回一个包含所有变量的对象:

...
}).then(product => {
var productInfo = await getPriceandASIN.getPriceandASIN(product.UPC);
return { product, productInfo };
}).then(data => {  
console.log(data.productInfo);
console.log(data.product);
// ...
})
});

最新更新