代码之家  ›  专栏  ›  技术社区  ›  adam tropp

我如何才能让自己接触到链中先前承诺的已解决价值?

  •  0
  • adam tropp  · 技术社区  · 6 年前

    我在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),那么整个函数就会中断,我只获取集合中第一个项目(而不是产品)的信息,而没有其他内容。是什么导致了这种行为?我认为有一些事情我根本不理解解决承诺,但我不知道从医生那里得到什么。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mike 'Pomax' Kamermans    6 年前

    您调用的函数中没有要取消引用的“product”变量 console.log(product) 在中,编程的基本原理适用:如果您想访问某个对象,请使该对象可访问。在这种情况下,使上一个处理程序 return 所有你需要的数据。如果是一个var,返回一个var。如果是多个var,返回一个包含所有变量的对象:

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