如何让自己获得链中先前承诺的已解决价值?

时间:2018-08-20 21:35:27

标签: node.js express asynchronous promise es6-promise

我有一条快速路线,我想执行一堆异步操作,然后在满足某些条件的情况下向数据库中添加一些数据。到目前为止,它看起来像这样(index.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()
    })
  });
}) 

如果我只是console.log(info),则会得到预期的响应,这是为集合中的每个项目调用先前的异步函数的结果。但是,如果我也尝试console.log(product),则整个功能将中断,并且我只获得集合中第一项(而不是产品)的信息,而没有其他信息。是什么导致此行为?我认为从根本上我对解决诺言不了解,但是我无法从文档中分辨出什么。

1 个答案:

答案 0 :(得分:1)

您要在其中调用console.log(product)的函数中没有要取消引用的“产品”变量,因此适用于编程的基础知识:如果要访问事物,则使该事物可访问。在这种情况下,使上一个处理程序return成为您需要的所有数据。如果那是一个变量,则返回一个变量。如果是多个var,请返回所有对象:

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