Pankaj Sharma
Pankaj Sharma

Reputation: 146

How to Send response after for each loop completed

Response.json should execute after foreach loop completes its execution

var todoarr = (req.body.data) ? req.body.data : undefined
    todoarr.forEach(function(element) {
         if(element.done == true) {
             TodoService.removeTodo(element, function(success) {
             });   
         }
        }); 
        res.json("success");

Upvotes: 1

Views: 5705

Answers (3)

samkan
samkan

Reputation: 101

You can send the response inside the callback function of forEach.

Modify your function so that it will call res.json() on the last iteration only.

Example:

var todoarr = (req.body.data) ? req.body.data : undefined
todoarr.forEach(function(element,index) {

    if(element.done == true) {
        TodoService.removeTodo(element, function(success) {
        });   
    }

    if(index==todoarr.length-1){
        res.json("success");
    }
});

However, it may not be according to coding standards but it can definitely solve the problem.

Upvotes: 3

Victorious
Victorious

Reputation: 96

You can't send multiple responses on single request, the only thing you can do it's a single response with the array of results:

es with async:

const async = require('async')
// FIX ME: this isn't correctly handled! 
const todoarr = (req.body.data) ? req.body.data : undefined 

let results = []

async.each(todoarr, function(element, callback) {

  console.log('Processing todo ' + element)

  if(element.done == true) {
    TodoService.removeTodo(element, function(err, success) {
      if(err){
        callback(err)
      } else {
        results.push(success)
        callback(null, success)
      }
    })
  }
}, function(err) {
  if(err) {
    console.log('A element failed to process', err)
    res.status(500).json(err)
  } else {
    console.log('All elements have been processed successfully')
    // array with the results of each removeTodo job
    res.status(200).json(results) 
  }
})

Upvotes: 3

Mykola Borysyuk
Mykola Borysyuk

Reputation: 3411

You can try to use async.js http://caolan.github.io/async/ .

each method http://caolan.github.io/async/docs.html#each

Or you can try use Promise.all.

For example:

let promiseArr = [];
todoarr.forEach(function(element) {
     if(element.done == true) {
         promiseArr.push(somePromiseMethod(element)); 
     }
}); 
//now execute promise all
Promise.all(promiseArr)
.then((result) => res.send("success"))
.catch((err) => res.send(err));

More info here. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

Some promise example:

function somePromiseMethod(element) {
   return new Promise((resolve,reject) => {
      TodoService.removeTodo(element, function(success) {
            resolve();
         });
   });    
}

Hope this helps.

Upvotes: 8

Related Questions