Javascript 如何以回调方式先执行n次异步循环,然后执行一次函数?

Javascript 如何以回调方式先执行n次异步循环,然后执行一次函数?,javascript,node.js,Javascript,Node.js,这不是一个关于如何在nodejs中执行post multipart表单的问题 但如何以回调的方式执行这样的逻辑(首先执行n次循环(异步),然后执行一次函数(异步)) 例如,客户端将发布包含普通表单字段的多部分表单: req.files[n]:包含n个映像,需要保存到服务器的本地文件系统 请求正文:包含post.title、post.content、post.user 在正常情况下(php、java…),示例代码是 array savedPath = []; // save images to l

这不是一个关于如何在nodejs中执行post multipart表单的问题

但如何以回调的方式执行这样的逻辑(首先执行n次循环(异步),然后执行一次函数(异步))

例如,客户端将发布包含普通表单字段的多部分表单:

req.files[n]:包含n个映像,需要保存到服务器的本地文件系统

请求正文:包含post.title、post.content、post.user

在正常情况下(php、java…),示例代码是

array savedPath = [];
// save images to local filesystem
foreach image in files
  savedPath.push(saveImageToLocal(image))
// append saved images path to post
var post = req.body;
post.images = savedPath;
Posts.insert(post)
但在nodejs中,回调方式,我如何编写它呢

var savedPath = [];
saveImageToLocal(files[0], function(path) {
  savedPath.push(path);
  saveImageToLocal(files[1], function(path) {
    savedPath.push(path);
    //.... its n elements, how can I write it??
   var post = req.body;
   post.images = savedPath;
   Posts.insert(postfunction(err, result) {
      res.send(err, result)
    });
  });
});

var savedPath=[];

对于(i=0;i协调多个异步操作的最佳方法是使用承诺。因此,如果这是我的代码,我将更改或包装
saveImageToLocalTo()
Posts.insert()
返回承诺,然后使用承诺功能来协调它们。如果您要编写大量node.js代码,我建议您立即投资学习承诺的工作原理,并开始将其用于所有异步行为

要在没有承诺的情况下解决问题,您必须实现一个计数器并跟踪所有异步操作何时完成:

var savedPath = [];
var doneCnt = 0;
for(i=0;i<n;i++) {
  savesaveImageToLocalTo(files[i], function(path) {
    ++doneCnt;
    savedPath.push(path);
    // if all the requests have finished now, then do the next steps
    if (doneCnt === n) {
        var post = req.body;
        post.images = savedPath;
        Posts.insert(postfunction(err, result) {
            res.send(err, result)
        });
    }
  });
}
var savedPath=[];
var doneCnt=0;

对于(i=0;i)您希望在数组中存储值,并且每次在回调检查中
如果(myArr.length==n){finalize();}
您(或与您一样的人)大约10分钟前刚刚发布了这个相同的问题。我现在找不到它,所以可能它已经关闭了。@jfriend00为什么要关闭它?我认为这对于nodejs/回调新手来说很常见,而且非常困难。我没有关闭任何东西。我只是评论说,我几分钟前刚刚看到了这个相同的问题。当问题很糟糕时,在这里关闭手写。这是网站保持更高质量的方式。他们被关闭的原因通常在关闭原因或评论中解释。这里的新用户有时会以一种不愉快的方式被打乱,直到他们学会如何编写好的问题或提供好的答案。我不是说这是gr吃,但经常发生。@jfriend00谢谢。我已经尽了最大努力用我蹩脚的英语详细说明了这个问题,为什么他们只是关闭它而不是要求对这个问题进行更多解释?是不是因为这个问题太愚蠢了?非常感谢,我已经阅读了《承诺》,这正是我想要的。
var savedPath = [];
var doneCnt = 0;
for(i=0;i<n;i++) {
  savesaveImageToLocalTo(files[i], function(path) {
    ++doneCnt;
    savedPath.push(path);
    // if all the requests have finished now, then do the next steps
    if (doneCnt === n) {
        var post = req.body;
        post.images = savedPath;
        Posts.insert(postfunction(err, result) {
            res.send(err, result)
        });
    }
  });
}