[英]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.