Home > database >  Node JS: How can I pass arguments to promise resolve/reject from promise.all?
Node JS: How can I pass arguments to promise resolve/reject from promise.all?

Time:09-17

This code works, I just need help with argument passing.

Goal:

To pass arguments to promises while iterating through a for loop. The arguments to pass are named folder, subfolder, pastsearch. The promises are called p1 and p2

What the Code does

This code works. Each promise takes a search term, looks for it in its file and returns "yes" or "non" if file is there or not.

Promise.all prints a single line of yes/non to a file and prints the total count of "yes" to another file.

CODE

const fs = require('fs');
const readline = require('readline')


const task_id = 1;

let folder = 1;
let subfolder = 1;
let pastsearch = 1;

const myarray = [6567, 50105, 67637, 293697];

const mylen = myarray.length;

const myfiles = ['file_1.txt', 'file_2.txt'];


fs.writeFile('/pathtomyfile/', '', function() {
  console.log('done')
})


fs.writeFile('/pathtomyfile/', '', function() {
  console.log('done')
})


const p1 = new Promise((resolve, reject) => {
  let lineCount = 0;

  let v = 0;
  let yesnon = "non";

  let readStream = readline.createInterface({
    input: fs.createReadStream('/pathtofile/round_'   task_id   '/threehundred_'   folder   '/'   subfolder   '/'   myfiles[0], 'utf8')
  });


  readStream.on("line", (line) => {
    lineCount  ;

    if (line == pastsearch) {
      yesnon = "yes";

      v  ;
    }

  });

  readStream.on('end', () => {
    console.log('end');
    readStream.destroy();
  });


  readStream.on("close", () =>
    resolve({
      yesnon
    })

  )
});

const p2 = new Promise((resolve, reject) => {

  let readStream = readline.createInterface({
    input: fs.createReadStream('/pathtofile/round_'   task_id   '/threehundred_'   folder   '/'   subfolder   '/'   myfiles[1], 'utf8')
  });

  let lineCount = 0;
  let v = 0;
  let yesnon = "non";

  readStream.on("line", (line) => {
    lineCount  ;

    if (line == pastsearch) {
      yesnon = "yes";

      v  ;
    }

  });


  readStream.on('end', () => {
    console.log('end');
    readStream.destroy();
  });


  readStream.on("close", () =>
    resolve({
      yesnon
    }))

});

for (let h = 0; h < 3; h  ) {

  folder  
  subfolder  
  pastsearch = myarray[h];

  Promise.all([p1, p2]).then((results) => {

    const output = results.map(({
      yesnon
    }) => yesnon).join(' ');

    fs.appendFileSync('/pathtofile/plain_round'   task_id   '.txt', output   "\n", 'utf8');

    const output2 = results.map(({
      yesnon
    }) => yesnon);


    let count = 0;

    function countValues(array, countItem) {
      array.forEach(itm => {
        if (itm == countItem) count  ;
      });

      return count;
    }
    const myresult34 = countValues(output2, "yes");


    fs.appendFileSync('/pathtofile/round'   task_id   '.txt', myresult34   "\n", 'utf8');


  });
}

Note:

I am new to nodejs, mostly php experience, so I wrote this the best that I could from studying stackoverflow Q/A Posts.

CodePudding user response:

Wrap your promises in a function that takes folder, subfolder, and pastsearch as arguments. For example with p1:

const p1 = (folder, subfolder, pastsearch)  {
    return new Promise((resolve, reject) => {
        // `folder`, `subfolder` and `pastsearch` are available here
    }
}

Then invoke p1 inside Promise.all:

Promise.all([p1(folder, subfolder, pastsearch), p2]).then((results) => {

In javascript this technique is called closure

  • Related