如何在函数中返回promise的结果

时间:2018-03-17 22:50:14

标签: javascript node.js

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

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

3 个答案:

答案 0 :(得分:2)

amazonMws.products.search函数是异步的,这意味着它稍后会为您提供一个值,因此,您无法获得值 now 。相反,当你收到价值时,你必须说明你想要做什么以后

这是承诺的回报。承诺本身就是您稍后会收到的这个价值的表示。

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等待调用上述函数的内容:

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

而且,像往常一样,请务必查阅文档,了解您对此感到困惑的任何细节:

答案 1 :(得分:1)

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

    return amazonMws.products.search(options); //returns a promise
}

答案 2 :(得分:0)

正如其他人所指出的,Promise就像你认为的那样工作。

请参阅我对function returning too early before filter and reduce finish的回答,以便(希望)明确解释您所遇到的问题。