我正在努力理解如何從多個承諾回傳資料以構建資料陣列。
無論如何我可以在承諾之外回傳資料以推送到資料變數?
我有以下內容:
db_sh.find({
selector: {sh: req.params.sh_id},
fields: ['_id', 'sh_id', 'time'],
sort: ['_id']
}).then(function (result) {
let data = {};
console.log('Found: ' result.docs.length);
if (result.docs.length > 0) {
for (var i = 0; i < result.docs.length; i ) {
let student = result.docs[i];
Promise
.all([getMealBooking(student._id), getStudentData(student._id)])
.then(function(response) {
var meal_booking_data = response[0];
var student_data = response[1];
console.log(meal_booking_data);
console.log(student_data);
})
.catch(function (err) {
return res.send(false);
});
data[student.time] = [
meal_booking_data,
student_data
]
}
}
/** Sort Data Oldest First*/
data = Object.keys(data).sort().reduce((a, c) => (a[c] = data[c], a), {});
console.log(data);
res.send(data);
});
我有兩個承諾(getMealBooking() 和 getStudentData()):我正在使用 Promise.all() 向我回傳這兩個承諾的結果。我試圖回傳資料,但我無法獲得構建資料陣列的結果。
能夠建立我所有資料的串列的任何幫助都會很棒。
uj5u.com熱心網友回復:
您需要兩個Promise.alls - 一個迭代每個學生,一個嵌套一個來獲取每個學生的getMealBookingand getStudentData。
將所有內容放入一個異步函式(false如果需要,可以捕獲并發送),以使控制流更易于理解。
const { docs } = await db_sh.find({
selector: { sh: req.params.sh_id },
fields: ['_id', 'sh_id', 'time'],
sort: ['_id']
});
if (docs.length === 0) {
// no data; stop here
res.send({});
return;
};
const data = {};
await Promise.all(
docs.map(student => (
Promise.all([getMealBooking(student._id), getStudentData(student._id)])
.then(([mealBookingData, studentData]) => {
data[student.time] = [mealBookingData, studentData];
})
))
);
const sortedData = Object.keys(data).sort().reduce((a, c) => (a[c] = data[c], a), {});
res.send(sortedData);
uj5u.com熱心網友回復:
包含您已經弄清楚Promise.all()的回圈需要另一個。Promise.all()最好考慮一點,這樣你就可以看到正在發生的事情。
function getStudentMealAndData(student) {
return Promise
.all([getMealBooking(student._id), getStudentData(student._id)])
.then(function(response) {
var meal_booking_data = response[0];
var student_data = response[1];
console.log(meal_booking_data);
console.log(student_data);
return { student, meal_booking_data, student_data };
})
.catch(function (err) {
return res.send(false);
});
}
這簡化了 then 塊......
}).then(function (result) {
console.log('Found: ' result.docs.length);
let promises = []
for (var i = 0; i < result.docs.length; i ) {
let student = result.docs[i];
promises.push(getStudentMealAndData(student));
}
return Promise.all(promises);
}).then(results => {
// results are an array of [{ student, meal_booking_data, student_data }, ...]
let data = results.reduce((acc, s) => {
acc[s.student.time] = [ s.meal_booking_data, s.student_data ];
return acc;
}, {});
data = Object.keys(data).sort().reduce((a, c) => (a[c] = data[c], a), {});
console.log(data);
res.send(data);
});
uj5u.com熱心網友回復:
let arr = [];
const datas = await Promise.all([
getMealBooking(),
getStudentData()
]);
arr.push(datas[0]); //adds getMealBooking() results
arr.push(datas[1]); // adds getStudentData() results
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/476069.html
標籤:javascript 数组 循环 承诺 es6-承诺
上一篇:Maven包不可見編譯錯誤
