【发布时间】:2021-10-29 12:01:31
【问题描述】:
我在返回创建的对象时遇到问题,代码如下:
在 Promise.allSettled 中,我最终得到循环并将每个数组推送到一个对象的结果(这可以很好地创建对象),当我尝试返回该对象时,它是空的。
我想是因为我的承诺还没有兑现,我已经尝试过:
Promise.resolve(returnedData) 然后返回它,甚至返回 .then(results => results)。
我错过了什么?我想我已经看了很长时间了,我想念的东西很清楚。
const getProductData = () => {
debugger;
const productIds = [];
const returnedData = [];
const customerLocation = getCustomerLocation();
productdataItems.forEach((product) => {
productIds.push(
product
.querySelector('[data-test-id="product-card-code"]')
.innerHTML.replace(/[^0-9]/g, ''),
);
});
const items = productIds.map((product) => ({
productCode: product,
quantity: 1,
}));
// Load in products for other steps
const promises = [];
productIds.forEach((sku) => {
promises.push(getProduct(sku));
});
Promise.allSettled(promises).then((results) => {
// Stock requires location data.
if (customerLocation) {
getEligibility(items, customerLocation).then((eligibility) => {
getStock([customerLocation.collectionBranchId], productIds).then(
(stock) => {
results.forEach((result, i) => {
if (result.value.product) {
returnedData.push({
Product: result.value.product,
Eligibility: eligibility[i],
Stock: stock[i].quantity,
ProductMarkup: productdataItems,
PostCode: customerLocation.deliveryPostcode,
});
}
});
},
);
});
}
});
return returnedData;
};
【问题讨论】:
-
你在 allSettled 完成之前返回,所以它总是空的。您需要等待
Promise.allSettled才能使其正常工作。 -
就像@pilchard 试图解释的那样,问题是作为参数传递给
then的函数不会立即执行,而是安排在以后执行(不是在所有承诺都很好、解决之前,这可能需要一段时间,视情况而定),它们实际上是回调。因此,您对Promises.allSettled调用返回的承诺的then调用立即返回,并注册了一个将填充returnedData的回调函数,其关键区别在于,当then返回时,returnedData仍然为空大批。这就是你所缺少的。 -
您需要花一些时间了解 JavaScript 事件循环和承诺,特别是。这可能需要你一天的时间,但这是值得的,否则恐怕你会经常遇到这类问题。
标签: javascript function asynchronous es6-promise