Developing a promise-returning function and managing the callback process

See the code snippet I wrote below:

function retrieveAndSortUserRatings(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 organizeGameParticipants(userIds) {
  retrieveAndSortUserRatings(userIds)
  .then((users) => evaluateUsersByRatings(users))
  .then((playerAndRatings) => distributePlayersInTeams(playerAndRatings))
  .then(notification.sendPushNotificationTo('Teams have been chosen', 'Check your group to view your team', userIds))
  .catch((error) => {
    console.log(error);
  });
}

After logging users in the initial then, I noticed that it displays

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

This occurs before the users are retrieved from firebase. If I try to console.log(user) within the retrieveAndSortUserRatings function, they only appear after the users are logged. It seems incorrect as per my understanding that items in the promise should be printed prior to those in the then. I suspect there might be a mistake in how I created the promise function.

Answer №1

According to the API documentation linked, the on() function does not return a promise. It continuously listens until the listener is removed. In order to execute a single query that returns a promise indicating completion with a snapshot of the data, use the once() function instead.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Establishing an RSS feed (Google shopping) for an online store built on Vue-storefront

I recently launched a Vue-storefront based online store and now I'm looking to set up Google Shopping ads using an RSS feed for my products. However, I've encountered an error message saying "Unexpected token < in JSON at position 0" when tryi ...

Guide to streaming audio files using vue.js

I am attempting to incorporate an audio file into my vue.js project using the following code: import sound from '../../recordings/sound.mp4' const audio = new Audio(sound) audio.play() Although this method works perfectly fine, I have encounter ...

Parallax Effect Slows Down When Scrolling In Web Page

Currently in the process of creating a website with a scrolling parallax effect using Stellar.js on the header and three other sections. However, I'm experiencing lag when scrolling, especially at the top of the page. I've attempted to reduce la ...

Rotating a camera in ThreeJS for a quick orbit

I am using an orbital camera that orbits around a globe with markers for users to interact with. When a user clicks on a marker, the camera moves to that specific point. To animate this movement, I am utilizing TweenMax as shown below: TweenMax.to(curre ...

Creating a dropdown feature for menu items in Vue when the number or width of items exceeds the menu bar's limits

I am working on a navigation bar that displays menu items as tabs. One issue I am encountering is when the number of menu items exceeds the space available, I need to move the excess items into a dropdown menu (showmore) using Vue. Here is an example of t ...

When clicked, activate a different overlay div

I have an image that I want to enhance with some effects. I was able to add a hover overlay using a div. Now, I am looking to add an onclick event to change to another overlay div. Below is the code I have so far, or you can view the CodePen Here <d ...

"Is there a way to transmit a Firebase error message from a service to a controller

In my development work, I utilize Angular js and firebase. Specifically, for handling login and register forms, I have created a controller named "userController" which calls functions in my userProvider service. One challenge I faced was how to display f ...

Having trouble running Tensorflow JS in a Node Alpine Docker Container due to missing libraries? Let's walk through

I am encountering issues while trying to execute Tensorflow JS in a node docker image. The errors suggest that there are missing libraries. Dockerfile FROM node:16-alpine package.json "@tensorflow/tfjs-node": "^4.0.0", Some script im ...

TypeScript: creating an interface property that relies on the value of another

Is it feasible to have an interface property that relies on another? For instance, consider the following: const object = { foo: 'hello', bar: { hello: '123', }, } I wish to ensure that the key in bar corresponds to the value of f ...

Using assert.rejects() in Mocha and Node: A Complete Guide

Following the instructions in the documentation, I attempted to use assert.rejects to test for an error message (I have Node version above v10). However, no matter what message I specify, the test always passes. What could be causing this issue? it("is f ...

Getting the JavaScript file name within another JavaScript file - a simple guide

Imagine having an HTML file that references two external JavaScript files. One of these JavaScript files contains errors (likely compilation errors), while the other file includes an onerror method without any issues. When you open the HTML file in a brows ...

Creating a query string using a jQuery array that contains multiple values for a query variable

After writing some code to convert an array into a filter string, I noticed that the generated string was not in the format I wanted. product_size=123&product_size=456 Instead of this, I needed it to be product_size=123+456. To achieve this, I reali ...

Having trouble importing zone.js in Angular 14 and Jest 28

I am currently in the process of updating to Angular 14. Everything is going smoothly except for setting up jest. Since I have Angular 14 libraries included in my build, I need to utilize jest-ESM support. Below is my configuration: package.json { &qu ...

Obtain the parameters of a JavaScript function that is stored as a string

While parsing a webpage, I came across a JavaScript function stored as a string: "translate(737.4170532226562,136.14541625976562)" My goal is to extract the two parameters from this function. I currently parse the string up to the '(' and &apos ...

Using JavaScript, learn how to extract query parameters and encoded information from a URI

I am looking for a specific module in order to extract information from query parameters within a URL. The format includes 2 query parameters and an encoded piece of data. Do I need to use split functions or is there a more direct approach available? Sampl ...

How to use update aggregate to update an array within an array?

I have a collection with the following documents: { "category":"A", "list": [ { "item": 1, "sub_list": [ 11 ] }, { "item": 2, "sub_ ...

Pass RGBA color code from JavaScript to Laravel controller

I have an exciting project where users need to select a color value in hex format. Once I retrieve this value in JavaScript, I convert it to Rgba format. Now, my challenge is figuring out how to send this converted value to the controller for database stor ...

Convert a div into a clickable link using JavaScript without using too many classes or any ids

After using shortcodes generated by functions.php in a WordPress parent theme, I have come across the following HTML code: <div class="pricing-table-one left full-width "> <div class="pricing-table-one-border left"> <div class=" ...

My Vue code encountered an error stating "unknown custom element" when trying to run it

As a beginner web developer, I am trying to implement CRUD operations in my Laravel and Vue project. Following the steps outlined in this tutorial, I have installed Datatable components into my application. Now, I need to integrate Datatable into my proje ...

Executing blur event in AngularJS

Is there a way to set up an input so that when the length is equal to 5, it triggers a blur event automatically? Any tips on how to achieve this? Here is a basic concept of what I'm looking for: <input type="tel" placeholder="type here." ...