【问题标题】:Wait for all different promise to finish nodejs (async await)等待所有不同的promise完成nodejs(异步等待)
【发布时间】:2018-07-17 16:48:36
【问题描述】:

我目前正在等待所有承诺按顺序完成,如下所示:

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

但是这样一来,profile 和 token 会按顺序执行。由于两者都是相互独立的,我希望它们两个一起独立执行。我认为这可以使用 Promise.all 来完成,但我不确定语法,也找不到任何帮助。

所以我的问题是如何将上述 api 调用转换为一起运行,然后返回最终输出。

【问题讨论】:

标签: javascript node.js asynchronous async-await


【解决方案1】:

Promise.all 方法返回一个 Promise,当参数中的所有 Promise 都已解析或参数不包含任何 Promise 时,该 Promise 将解析。

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;
})
}

【讨论】:

    【解决方案2】:

    你想使用Promise.all

    Promise.all(iterable) 方法返回一个解析的 Promise 当可迭代参数中的所有承诺都已解决或 当可迭代参数不包含任何承诺时。它拒绝与 第一个拒绝的承诺的原因。

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

    【讨论】:

      【解决方案3】:

      使用Promise.all()方法:

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

      Wait until all ES6 promises complete, even rejected promises

      【讨论】:

      • 两个答案几乎同时出现,解释几乎相同。所以随机选择。
      【解决方案4】:
      (async() => {
        const [ profile, token ] = await Promise.all([
          profileHelper.getUserData(username),
          tokenHelper.getUserToken(username)
        ]);
      
        return { profile, token };
      })();
      

      【讨论】:

      • 两个答案几乎同时出现,解释几乎相同。所以随机选择。
      猜你喜欢
      • 2016-07-07
      • 2020-10-04
      • 2019-06-16
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多