我真的很困惑为什么我不能从amazonMws.products.search()返回JSON结果,并且可以使用一些帮助来了解发生了什么。当我这样写的时候给了我undefined

function listMatchingProducts(query) {
    const options = {
        Version: VERSION,
        Action: 'ListMatchingProducts',
        MarketplaceId: MARKET_PLACE_ID,
        SellerId: SELLER_ID,
        Query: query
    }

    amazonMws.products.search(options, (err, res) => {
        if(err){
            throw(err)
            return
        }

        return res
    })
}


当使用undefined时,我也会得到amazonMws.products.search().then().catch()

如果我return amazonMws.products.search()我得到了诺言而不是结果。

如果我console.log(res)在回调内部,我会得到期望的JSON结果。因此,这使我相信我需要使用我认为的async await,但这会导致Promise { <pending> }

async function listMatchingProducts(query) {
    const options = {
        Version: VERSION,
        Action: 'ListMatchingProducts',
        MarketplaceId: MARKET_PLACE_ID,
        SellerId: SELLER_ID,
        Query: query
    }

    return await amazonMws.products.search(options)
    .then(res => {
        return res
    })
    .catch(e => errorHandler(e))
}


我完全迷失了,所以如果有人可以向我解释发生了什么,那将不胜感激。

最佳答案

amazonMws.products.search函数是异步的,这意味着它稍后将为您提供一个值,因此,您现在无法获取该值。取而代之的是,当您收到该值时,您必须说出以后要做什么。

这就是兑现诺言的目的。承诺本身就是您稍后将收到的该值的表示。

function listMatchingProducts(query) {
    const options = {
        Version: VERSION,
        Action: 'ListMatchingProducts',
        MarketplaceId: MARKET_PLACE_ID,
        SellerId: SELLER_ID,
        Query: query
    }

    return amazonMws.products.search(options)
}


然后,在调用函数时,将处理程序附加到Promise。

listMatchingProducts(someQuery)
  .then(result => {/* do something with result */})
  .catch(error => {/* handle the error */})


而且,尽管您无需在此处使用异步等待,但它可以使代码在某些情况下看起来更好一些,就好像它是同步的一样。这是使用async await调用上面的函数的样子:

async function getProducts() {
  try {
    const result = await listMatchingProducts(someQuery)
    // do something with result
  } catch (error) {
    // handle the error
  }
}


而且,像往常一样,请随时向文档咨询有关您困惑的任何详细信息:


Using promises
await keyword

07-24 09:22