Javascript 什么';解决异步任务的最佳方法是什么?

Javascript 什么';解决异步任务的最佳方法是什么?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我有一个express服务器,它接受许多上传的文件,并转换/翻译其中的一些文件 解决许多异步操作的最佳(简单/高效)方法是什么?我可以制作一个数组,并将其作为完成文件的检查表使用,但这让我感觉有点不对劲,我担心如果出现任何文件错误,该过程将永远无法完成,用户也永远不会收到文件已完成/准备就绪的通知 我肯定我不是第一个遇到这个问题的人,所以任何关于这个问题的博客文章/在线书籍都是非常受欢迎的 if (req.files) req.files.forEach(saveFile); else

我有一个express服务器,它接受许多上传的文件,并转换/翻译其中的一些文件

解决许多异步操作的最佳(简单/高效)方法是什么?我可以制作一个数组,并将其作为完成文件的检查表使用,但这让我感觉有点不对劲,我担心如果出现任何文件错误,该过程将永远无法完成,用户也永远不会收到文件已完成/准备就绪的通知

我肯定我不是第一个遇到这个问题的人,所以任何关于这个问题的博客文章/在线书籍都是非常受欢迎的

if (req.files)
    req.files.forEach(saveFile);
else
    console.log("\tDoesn't has multifiles", req.file);

function saveFile(file){
    //file is renamed/moved (async)
    if(isCertainFileType(file))
          //convert and save converted file. Do not send a 200 or update the index until this is complete       

}

updateDirIndex(); //index must be updated before sending 200 (reads all files in dir and writes to a file)

return res.status(200).send(index); //tell the browser their files are ready

只要您的所有异步任务都返回一个
承诺
,您就可以等待它们全部使用解析


注意:前面假设您希望首先进行所有处理,然后在处理完成后保存所有内容。还可以将处理和保存过程瘫痪到单独的承诺链中,并在最后使用
promise.all()
将它们全部收集起来。这个例子更容易理解。

只要所有异步任务都返回一个
承诺
,您就可以等待它们全部使用解析


注意:前面假设您希望首先进行所有处理,然后在处理完成后保存所有内容。还可以将处理和保存过程瘫痪到单独的承诺链中,并在最后使用
promise.all()
将它们全部收集起来。这个例子更容易理解。

到目前为止,你的研究结果是什么?请记住,建议论坛不是这样的,因为建议往往很快就会过时。@Soviut sharding和数据库解决方案对于我认为可以在生成任务的函数中处理的内容来说,感觉完全是过火了。我不认为对异步代码建模的建议会很快过时,但我显然不是权威。异步代码在Node和JS universes中已经改变了好几次。我的观点更倾向于寻求建议,而不是具体的解决方案。即使是一些伪代码也会有所帮助。@Soviut代码补充道。这是我经常遇到的一个问题,所以我真的在寻找一个关于如何编写异步并且没有这些问题的指南。你在搜索JS异步时没有遇到承诺吗?到目前为止,你的研究发现了什么?请记住,建议论坛不是这样的,因为建议往往很快就会过时。@Soviut sharding和数据库解决方案对于我认为可以在生成任务的函数中处理的内容来说,感觉完全是过火了。我不认为对异步代码建模的建议会很快过时,但我显然不是权威。异步代码在Node和JS universes中已经改变了好几次。我的观点更倾向于寻求建议,而不是具体的解决方案。即使是一些伪代码也会有所帮助。@Soviut代码补充道。这是我经常遇到的一个问题,所以我真的在寻找一个关于如何编写异步并且没有这些问题的指南。你在搜索JS async时没有遇到承诺吗?@Sam我已经更新了我的代码以反映你的问题。注意,通过承诺,我们可以并行处理所有内容,然后使用承诺收集。all()谢谢@soviut,我不知道你可以解决这样一组承诺!那看起来很。。。承诺。@Sam我已更新代码以反映您的问题。注意,通过承诺,我们可以并行处理所有内容,然后使用承诺收集。all()谢谢@soviut,我不知道你可以解决这样一组承诺!那看起来很。。。有希望。
let filesToProcess = [...]

// first process any files that need processing, returning an array of promises
let processPromises = filesToProcess.map(file => {
  // if it needs processing, do it and return the promise
  if (isCertainFileType(file)) {
    return doProcessing(file)
  }
  // otherwise just return the file, any truthy value is considered a resolved promise
  else {
    return file
  }
})

// then save all the files
let savePromises = processPromises.map(file => {
  return saveFile(file)
})

// wait for all saves to complete (resolve), handle results or handle errors
Promise.all(savePromises)
  .then((result) => {
    // update the directory index here because we know everything was successful
    updateDirIndex()
  })
  .catch((err) => console.error(err))