Javascript 每个循环完成后如何发送响应

Javascript 每个循环完成后如何发送响应,javascript,node.js,Javascript,Node.js,Response.json应该在foreach循环完成执行后执行 var todoar=(请求主体数据)?req.body.data:未定义 todoar.forEach(函数(元素){ if(element.done==true){ TodoService.removeTodo(元素、函数)(成功){ }); } }); res.json(“成功”)您可以尝试使用async.js 每种方法 或者您也可以尝试使用Promise.all 例如: let promiseArr = [];

Response.json应该在foreach循环完成执行后执行

var todoar=(请求主体数据)?req.body.data:未定义
todoar.forEach(函数(元素){
if(element.done==true){
TodoService.removeTodo(元素、函数)(成功){
});   
}
}); 

res.json(“成功”)您可以尝试使用async.js

每种方法

或者您也可以尝试使用
Promise.all

例如:

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));
更多信息请点击这里

例如:

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

希望这有帮助。

您可以尝试使用async.js

每种方法

或者您也可以尝试使用
Promise.all

例如:

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));
更多信息请点击这里

例如:

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

希望这能有所帮助。

您不能在一个请求中发送多个响应,您唯一能做的就是使用一系列结果发送一个响应:

带异步的es:

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) 
  }
})

您不能在一个请求上发送多个响应,您唯一能做的就是使用结果数组发送一个响应:

带异步的es:

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) 
  }
})

您可以在
forEach
的回调函数中发送响应

修改函数,使其仅在最后一次迭代时调用
res.json()

示例:

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");
    }
});

但是,它可能不符合编码标准,但它肯定可以解决问题。

您可以在
forEach
的回调函数中发送响应

修改函数,使其仅在最后一次迭代时调用
res.json()

示例:

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");
    }
});

然而,它可能不符合编码标准,但它肯定能解决问题。

您是否尝试async.js或promisesCheck?也许您应该使用simple for loop?@Mykola Borysuk我尝试过,但想知道使用co、async或promisesCheck来实现这一点的最佳方法请查看我的答案。希望你能找到一些有用的东西。你试过async.js或promisesCheck吗?也许你应该使用simple for loop?@Mykola Borysuk我试过了,但想知道使用co、async或promisesCheck实现这一点的最佳方法。请检查我的答案。希望你能找到有用的东西。