Home > OS >  Putting variable in multiple path
Putting variable in multiple path

Time:10-01

I am new to javascript and have a code right here which works really great. But it puts the variable k only to one path. I also want to add it to few more paths.

This here with one path works great.

function checkpath() {
   var db = admin.database();
    var ref =  db.ref('placeID/here:pds:place:276u0wuu-237aa2a/'   messageID   '/notification');
    ref.get()
    .then((snapshot) => {
      if (snapshot.exists()) {
        const keyArray = Object.keys(snapshot.val());
        return Promise.all(keyArray.map(k => db.ref('/user/'   k   '/notification/'   subMessageID   '/subMessageID/').set(subMessageID)));
      } else {
        console.log('No data available');
        return null;
        
      }
    })
}

This one does not work. It gives me the error: "Exception from a finished function: ReferenceError: k is not defined"

function checkpath() {
    var db = admin.database();
    var ref =  db.ref('placeID/here:pds:place:276u0wuu-237aa2a/'   messageID   '/notification');
    ref.get()
    .then((snapshot) => {
      if (snapshot.exists()) {
        const keyArray = Object.keys(snapshot.val());
        return Promise.all(keyArray.map(k => 
            
            (db.ref('/user/'   k   '/notification/'   subMessageID   '/subMessageID/').set(subMessageID)),
            (db.ref('/user/'   k   '/notification/'   subMessageID   '/userTime/').set(userTime))
        
        ));
      } else {
        console.log('No data available');
        return null;
        
      }
    })
}

CodePudding user response:

This is because your callback function returns two Objects (here two Promises) separated by a comma.

Let's illustrate the problem with the following code snippets:

const array1 = [1, 4, 9, 16];
const map1 = array1.map(x => (x * 2, x * 3)); // See the parenthesis
console.log(map1);

returns > Array [3, 12, 27, 48]

because the anonymous callback function returns the second expression i.e. x * 3.

Now if you remove the parenthesis as follows

const array1 = [1, 4, 9, 16];
const map1 = array1.map(x => x * 2, x * 3); 
console.log(map1);

it returns Error: x is not defined because with just x *3, x is not defined (while it is defined within x => x * 2)


However, in your case, you cannot add parenthesis because you want to get the two Promises added to the Array you're going to pass to Promise.all().

Therefore you need to do something along the following lines, by pushing the promises in an Array:

  function checkpath() {
    var db = admin.database();
    var ref = db.ref(
      'placeID/here:pds:place:276u0wuu-237aa2a/'  
        messageID  
        '/notification'
    );
    return ref.get().then((snapshot) => {
      if (snapshot.exists()) {
        const keyArray = Object.keys(snapshot.val());
        const promises = [];
        keyArray.forEach((k) => {
          promises.push(
            db
              .ref(
                '/user/'  
                  k  
                  '/notification/'  
                  subMessageID  
                  '/subMessageID/'
              )
              .set(subMessageID)
          );
          promises.push(
            db
              .ref(
                '/user/'  
                  k  
                  '/notification/'  
                  subMessageID  
                  '/userTime/'
              )
              .set(userTime)
          );
        });
        return Promise.all(promises);  // Not sure you need to return anything here because the set() method returns a Promise<void>...
      } else {
        console.log('No data available');
        return null;
      }
    });
  }
  • Related