Как использовать Promise с вложенным foreach - PullRequest
0 голосов
/ 16 марта 2020

Я нахожу кошельки всех пользователей во вложенном foreach l oop, но я не могу понять, где использовать resol () для обратного обратного вызова,

function genwallets() {
    return new Promise((resolve, reject) => {
    var i = 0;
    try {
        db.users.findAll({}).then((users)=>{
            db.supportedTokens.findAll({}).then((tokens)=>{ 
                users.forEach(function(user) {
                    tokens.forEach(function(token) {
                    db.wallets.findOne({where:{userId: user['id'], supportedTokenId: token['id']}}).then((wallet)=>{
                        console.log(JSON.stringify(wallet));
                    })
                    });
                });
            })
        });

    } catch (err) {
        console.log(err);
    }
});
}

1 Ответ

1 голос
/ 16 марта 2020

forEach не работает с обещаниями. либо используйте for...of или Promise.all что-то вроде этого

function genwallets() {
  return new Promise((resolve, reject) => {
    var i = 0;
    try {
      db.users.findAll({}).then(users => {
        db.supportedTokens.findAll({}).then(tokens => {
          for(const user of users) {
            for(const token of tokens) {
              db.wallets
                .findOne({
                  where: { userId: user["id"], supportedTokenId: token["id"] }
                })
                .then(wallet => {
                  console.log(JSON.stringify(wallet));
                });
            }
          }
        });
      });
    } catch (err) {
      console.log(err);
    }
  });
}

так, как вам не нужно обернуть его в обещание.

Вы можете упростить это, используя async/await

async function genwallets() {
  const users = await db.users.findAll({});
  const tokens = await db.supportedTokens.findAll({});

  for(const user of users) {
    for(const token of tokens) {
      const wallet = await db.wallets
        .findOne({
          where: { userId: user["id"], supportedTokenId: token["id"] }
        });
    }
  }
}
...