创建一个返回承诺并处理回调的函数

时间:2018-09-07 06:34:10

标签: javascript firebase firebase-realtime-database promise

这是我的代码:

function getUserRatingsSorted(userIds) {
  return Promise.all(userIds.map(id => {
    return admin.database().ref().child('users').child(id).on('value', (s) => {
      const user = s.val();
      user.id = id;
      return user;
    });
  }));
}
function prepareGameForStart(userIds) {
  getUserRatingsSorted(userIds)
  .then((users) => evaluateUsersByRatings(users))
  .then((playerAndRatings) => distributePlayersInTeams(playerAndRatings))
  .then(notification.sendPushNotificationTo('Teams have been selected', 'Log in to your group to see your team', userIds))
  .catch((error) => {
    console.log(error);
  });
}

当我在第一个然后中登录 用户 时,我会得到

  

[[Function],[Function],[Function],[Function]]

,它会在从Firebase检索用户之前被触发。因此,如果我在console.log(user)函数中getUserRatingsSorted,则在记录 用户 后,它们会被打印出来。对我来说,这听起来不对,因为应先打印诺言中的内容,然后再打印然后中的内容。我相信我在创建promise函数时做错了事。

1 个答案:

答案 0 :(得分:1)

on()不返回承诺(如从链接的API文档中可以看到的)。它会无限期地监听,直到您删除监听器为止。而是使用once()执行单个查询,该查询返回一个承诺以表示查询已完成,其中包含数据快照。