我真的很困惑为什么我不能从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