web-dev-qa-db-fra.com

Attend toutes les promesses différentes pour terminer nodejs (async wait)

J'attends actuellement toutes les promesses pour terminer séquentiellement comme ceci:

(async() => {
  let profile = await profileHelper.getUserData(username);
   let token = await tokenHelper.getUserToken(username);
   console.log(profile);
   console.log(token);
   return {profile: profile, token: token};
})();

Mais de cette façon, le profil et le jeton s'exécutent de manière séquentielle. Puisque les deux sont indépendants l'un de l'autre, je veux que les deux soient exécutés indépendamment ensemble. Je pense que cela peut être fait en utilisant Promise.all, mais je ne suis pas sûr de la syntaxe et je ne pouvais pas trouver d'aide non plus.

Ma question est donc de savoir comment je peux convertir les appels API ci-dessus pour qu'ils fonctionnent ensemble, puis renvoyer la sortie finale.

6
undefined
(async() => {
  const [ profile, token ] = await Promise.all([
    profileHelper.getUserData(username),
    tokenHelper.getUserToken(username)
  ]);

  return { profile, token };
})();
12
Jose Paredes

utilisez la méthode Promise.all():

(async() => {
 let [ profile, token ] = await Promise.all(
  [profileHelper.getUserData(username), 
  tokenHelper.getUserToken(username)
 ])
 return {profile: profile, token: token};
})();

Attendez que toutes les promesses de l'ES6 soient complètes, voire rejetées

10
messerbill

Vous voulez utiliser Promise.all

La méthode Promise.all (iterable) renvoie une seule promesse qui résout lorsque toutes les promesses de l'argument itérable ont été résolues ou lorsque l'argument itérable ne contient aucune promesse. Il rejette avec le raison de la première promesse qui rejette.

(async() => {
  const response = await Promise.all([
    profileHelper.getUserData(username),
    tokenHelper.getUserToken(username)
  ]);

  return {profile: response[0], token: response[1]};
})();
8
Michal

La méthode Promise.all renvoie une seule promesse qui est résolue lorsque toutes les promesses de l'argument sont résolues ou lorsque l'argument ne contient aucune promesse.

exports.getServerDetails = async (req, res, next) => {
var getCount = [];
const [ onlineUser, countSchool ] = await Promise.all([
    getOnlineUsers(), // online user count
    getRegisterUser(), // register user
    getRegisterSchools(), // register school count
]);
getCount = [
            {"Online Users": onlineUser},
            {"Registered Users" : countSchool}
        ];
sendJSONresponse(res, 200, {
    status: 'success',
    data: getCount
})
}
async function getOnlineUsers() {
return Login.count({'onlineStatus': 1}, (err, count) => {
    if (err) {
        return err;
    }
    return count;
});
}

async function getRegisterUser() {
return Login.count({}, (err, totResUser) => {
    if (err) {
        return err;
    }
    return totResUser;
})
}

async function getRegisterSchools() {
return Login.count({'role': 'Admin'},(err, totalSchool) => {
    if (err) {
        return err;
    }
    return totalSchool;
})
}
0