我正在尝试编写这个基于计时器的函数。它应该每周运行一次并创建现有文档的几乎副本。 每次我尝试启动它时,我都会收到“Promise 必须得到适当处理”错误,但我不明白我做错了什么?任何阶段都有可能回归。 哪里有我没有兑现的 promise ?
我之前已经推出了大约 40 个云函数,所以我确实对 Promise 的工作原理有一些了解,但我显然在这里遗漏了一些东西,而且对于我的一生,我无法理解它是什么。
这是函数:
exports.createRecurringDeals = functions.pubsub.schedule('0 0 * * 7').timeZone('Asia/Jerusalem').onRun((context) => {
db.collection('recurring_deals').get().then(querySnapshot => {
querySnapshot.forEach(bus => {
const businessListDoc = bus.data();
if (businessListDoc !== undefined) {
const dealsList = businessListDoc.list as Array<String>
return db.doc('businesses/' + bus.id).get().then(busDoc => {
const business = busDoc.data();
if (business !== undefined) {
dealsList.forEach(deal => {
return db.doc('deals/' + deal).get().then(snapshot => {
const oldDeal = snapshot.data();
if (oldDeal !== undefined) {
const promises: any = [];
const startTime = oldDeal.startTime + oldDeal.interval;
const endTime = oldDeal.endTime + oldDeal.interval;
const newDealDoc = db.collection('deals').doc();
const newDeal = {
id: newDealDoc.id,
business_ID: business.id,
business_name: business.name,
business_address_text: business.address_text,
business_address_lat: business.address_lat,
business_address_long: business.address_long,
business_phone_number: business.phone_number,
business_image: business.restaurant_photos[0],
business_categories: business.categories,
business_sub_categories: business.sub_categories,
discount: oldDeal.discount,
timestamp_start: startTime,
timestamp_end: endTime,
gmt: oldDeal.gmt,
amount: oldDeal.amount,
claimers: [],
active: true
};
promises.push(newDealDoc.set(newDeal));
promises.push(db.doc('recurring_deals/' + business.id).update({ list: FieldValue.arrayRemove(oldDeal.id) }));
promises.push(db.doc('recurring_deals/' + business.id).update({ list: FieldValue.arrayUnion(newDeal.id) }));
return Promise.all(promises);
} else {
return null;
};
});
});
return null;
} else {
return null;
};
});
} else {
return null;
};
});
return null;
});
});
最佳答案
我猜测它希望您在 .then
之后添加一个 .catch()
子句,以防 Promise 由于某种原因失败。例如,尝试更改
return db.doc('deals/' + deal).get().then(snapshot => {
...
});
至
return db.doc('deals/' + deal).get().then(snapshot => {
...
}).catch(err => console.log(err));
关于javascript - 必须正确处理 Promise 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58522020/