簡體   English   中英

嵌套 Promise 的變量分配未解析(條帶 API)

[英]Variable Assignment of Nested Promise Not Resolving (Stripe API)

使用 Stripe API,我調用所有產品stripe.products.list() ,然后嘗試使用map() ZC1C425268E68385D1AB507 為每個產品的 append 定價數據stripe.prices.list() 每個調用都返回一個 promise,盡管嵌套的 promise 沒有解析,而是返回一個空價格object。 我錯過了什么?

export function handler(event, context, callback) {
    stripe.products
        .list()
        .then(products =>
            products.data.map(product => ({
                ...product,
                prices: stripe.prices                    //  <-- ASSIGNMENT NOT RESOLVED
                    .list({ product: product.id })
                    .then(prices => {
                        console.log(prices)              //  <-- RESOLVED IN CONSOLE
                        return prices
                    }),
            }))
        )
        .then(rsp => {
            callback(null, {
                headers: { 'Content-Type': 'application/json' },
                statusCode: 200,
                body: JSON.stringify(rsp),
            })
        })
        .catch(err => console.warn(err))
}

Array.map同步執行,您無需等待products.data.map中的承諾。 prices object 不是空的,它是 promise。 控制台中的 output 只有在處理程序已經返回后才會生成。

一個簡單的方法,如下。 即將收到的產品存儲在一個變量中。 然后使用Promise.all()獲取所有產品的價格。 然后結合這兩個 arrays 得到最終結果。

export function handler(event, context, callback) { 
  let theproducts;
  stripe.products
    .list()
    .then(products => {
      theproducts = products.map(p => p.data);
      return Promise.all(products.data.map(product => 
          stripe.prices.list({ product: product.id }))
        )
     })
     .then(prices => theproducts.map((p, i) => ({...p, prices: prices[i]})
     .then(rsp => {
       callback(null, {
         headers: { 'Content-Type': 'application/json' },
         statusCode: 200,
         body: JSON.stringify(rsp),
       })
      })
      .catch(err => console.warn(err))
}

您還可以在stripe.prices.list()解析時立即合並產品和價格,從而節省 map 的額外迭代。 但我個人覺得這種方式更具可讀性。 如果你沒有太多的產品,額外的迭代不會花費太長時間。

您不是在等待內部 promise 解決:

export function handler(event, context, callback) {
    stripe.products
        .list()
        .then(products =>
            return Promise.all(products.data.map(product => {
                return stripe.prices                    //  <-- ASSIGNMENT NOT RESOLVED
                    .list({ product: product.id })
                    .then(prices => {
                        console.log(prices)              //  <-- RESOLVED IN CONSOLE
                        return prices
                    }),
            }))
            .then(prices => {
                return {
                    ...product,
                    prices
                };
            });
        )
        .then(rsp => {
            callback(null, {
                headers: { 'Content-Type': 'application/json' },
                statusCode: 200,
                body: JSON.stringify(rsp),
            })
        })
        .catch(err => console.warn(err))
}

您已返回 products.data.map 中的數組。 然而,這是一系列的承諾。 當你 map 他們和鏈 promise。 它實際上並沒有解決 promise。 我建議你嘗試一些異步語法來簡化代碼。

(async () => {
       const blah = products.data.map(product => {
            const prices = await stripe.prices.list({ product: product.id });
            return { ...product, prices };
        });
       console.log(blah);
})()

有了很多有用的輸入,我最終得到了以下內容。

export function handler(event, context, callback) {
    stripe.products
        .list()
        .then(products => {
            return Promise.all(
                products.data.map(product =>
                    stripe.prices
                        .list({ product: product.id })
                        .then(prices => {
                            return prices
                        })
                        .then(prices => {
                            return {
                                ...product,
                                prices,
                            }
                        })
                )
            )
        })
        .then(rsp => {
            callback(null, {
                headers: { 'Content-Type': 'application/json' },
                statusCode: 200,
                body: JSON.stringify(rsp),
            })
        })
        .catch(err => console.warn(err))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM