async getSettlementByUser(email): Promise<any> {
let listofTerminalId = [];
// Get current user
let user = await this.userModel.findOne({ email: email });
// get list of sn
let tpeIndexes = user.bindedSn.map((item) => item);
//list des tpes binded to current user
let tpe = tpeIndexes.map(async (index) => {
let list = await this.tpeModel.find({ sn: index });
// console.log('liste des tpes', list);
let terminalId = list.map((item) => item.terminalId);
// console.log('terminalId', ...terminalId);
listofTerminalId.push(...terminalId);
console.log('listofTerminalId', listofTerminalId);
return await listofTerminalId.map(async (item) => {
return await this.modelSettlement
.find({ terminalID: item })
.then((res) => res)
.catch((err) => console.log(err));
});
// console.log('settlement', settlement);
// return settlement;
});
let promiseValue = await Promise.all(tpe);
console.log('promiseValue', promiseValue);
// // return promiseValue;
// return tpe;
}
OUTPUT
promiseValue [ [ Promise { <pending> } ], [ Promise { <pending> }, Promise { <pending> } ], [
Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ] ]
I used Promise.all() to handle this nested async still get this result so How can I resolve this problem and why it shows this error
CodePudding user response:
You use Promise.all
only on the outer layer of the nesting, not on the inner array of promises. You would also need to do
return Promise.all(listofTerminalId.map(async (item) => {
// ^^^^^^^^^^^
return this.modelSettlement
.find({ terminalID: item })
.catch((err) => console.log(err));
}));
However, given the listofTerminalId.push(...terminalId)
, it looks like you actually don't want any nesting. You may just want to
async getSettlementByUser(email): Promise<any> {
// Get current user
const user = await this.userModel.findOne({ email: email });
// list des tpes binded to current user
const tpes = await Promise.all(user.bindedSn.map(async (index) => {
const list = await this.tpeModel.find({ sn: index });
// console.log('liste des tpes', list);
return list.map((item) => item.terminalId);
}));
const listofTerminalId = tpes.flat();
console.log('listofTerminalId', listofTerminalId);
const settlements = await Promise.all(listofTerminalId.map((item) => {
return this.modelSettlement.find({ terminalID: item })
}));
console.log('settlements', settlements);
}
CodePudding user response:
You need to pass an array of promises to Promise.all
method that means you should neither await
the promises nor .then
them before passing them to Promise.all
.
So it might look like this:
async getSettlementByUser(email): Promise<any> {
let listofTerminalId = [];
let user = await this.userModel.findOne({ email: email });
let tpeIndexes = user.bindedSn.map((item) => item);
let tpe = tpeIndexes.map(async (index) => {
let list = await this.tpeModel.find({ sn: index });
let terminalId = list.map((item) => item.terminalId);
listofTerminalId.push(...terminalId);
return listofTerminalId.map((item) => {
return this.modelSettlement
.find({ terminalID: item })
});
});
let promiseValue = await Promise.all(tpe)
console.log('promiseValue', promiseValue);
}