【问题标题】:How can I give myself access to the resolved value of a previous promise in a chain?如何让自己访问链中先前承诺的已解决值?
【发布时间】:2019-01-27 01:25:29
【问题描述】:

我有一条 express 路由,我想在其中执行一堆异步操作,然后在满足某些条件时将一些数据添加到数据库中。到目前为止,它看起来像这样(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),整个函数就会中断,我只会得到集合中第一个项目(而不是产品)的信息,而没有别的。是什么导致了这种行为?我认为关于解决 Promise 有一些我根本不理解的东西,但我无法从文档中看出什么。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我试过了,但由于 productInfo 是一个异步函数,它会记录(promise )信息
    • 你只需 await 任何使用 async 的东西。答案中的代码适用于您的var productInfo,但请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 了解所有详细信息和大量示例。
    • 好的,我现在知道了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2015-06-24
    相关资源
    最近更新 更多