我有這個函式,假設在將資料保存到資料庫時回傳一個物件。
我需要回傳值,以便我可以將其傳遞給控制器
有人可以指導我了解這里有什么問題嗎?
exports.addBooking = async (bookingInfo) => {
const {
date,
serviceId,
name,
email
} = bookingInfo
try {
const selectedDate = await Day.find({
date
});
if (selectedDate.length > 0) {
let day = selectedDate[0];
day.services.map( service => {
service.isAvailable = false;
if (service._id == serviceId && service.reservation == null) {
service.reservation = new Reservation({
name,
email,
});
day.save ((err, savedDate) => {
if (err) {
console.log(err);
} else {
console.log("Reserved", savedDate);
return savedDate
}
});
}
})
}
} catch (error) {
throw new Error(error);
}
}
uj5u.com熱心網友回復:
假設您想要的邏輯是為您找到的第一個匹配服務創建預訂,一旦找到,退出回圈并回傳savedDate(實際上是回傳的承諾的決議值),那么您可以這樣做:
const util = require('util');
exports.addBooking = async (bookingInfo) => {
const {
date,
serviceId,
name,
email
} = bookingInfo;
const selectedDate = await Day.find({ date });
if (selectedDate.length > 0) {
const day = selectedDate[0];
// make promisified version of .save
if (!day.saveP) {
day.saveP = util.promisify(day.save);
}
for (const service of day.services) {
if (service._id == serviceId && service.reservation == null) {
service.isAvailable = false;
service.reservation = new Reservation({
name,
email,
});
const savedDate = await day.saveP();
console.log("Reserved", savedDate);
return savedDate;
}
}
}
}
如果您追求的是不同的業務邏輯(這在您的問題中并不完全清楚),那么您有望將這種結構與您自己的業務邏輯相適應。
筆記:
- 不要將
await使用普通回呼的異步操作和 promise混合使用。混合結構的錯誤處理和控制流非常困難。 - 轉換
day.save()為承諾版本。你沒有說day物件是什么,但如果它已經提供了一個承諾介面,那么就使用它。 - 僅
service.isAvailable = false在我們為其設定預訂時設定。我不清楚你為什么service.isAvailable = false在那天設定所有服務。如果您確實打算標記當天的所有服務,即使是不匹配的服務,您可以將該行移回回圈的開頭。 - 一旦做出并保存了預訂,回圈就會以
return陳述句終止。 - 使用
for/of回圈而不是.map()因為它更簡單,您沒有使用.map()為(創建新陣列)制作的內容,并且您可以在預訂后退出回圈。 - 該
return savedDate將savedDate是承諾了的決議值addBooking()函式回傳。
uj5u.com熱心網友回復:
我想到的第一件事是你應該等待你的地圖,只要地圖回傳我從上面的代碼中看到的承諾陣列。此外,您不會將地圖分配給任何東西,因此基本上您的功能型別是Promise<void>.
嘗試使用await Promise.all或await Promise.allSettled。然后你可以從地圖中檢索你的專案或拋出一個錯誤(或記錄它)。
const [variable] = await Promise.all(%your_map_here% that should look like map(async(value) => {}))
編輯:在閱讀時,您的代碼也有點復雜。不要在函式的整個塊上使用 try catch,而是將它用于拋出的塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/371266.html
標籤:javascript 节点.js
