Javascript 在异步模块内调用函数而不进行回调

Javascript 在异步模块内调用函数而不进行回调,javascript,fs,async.js,Javascript,Fs,Async.js,我对以下示例有一个问题: 这个例子调用fs.stat在数组的每个元素中使用item,callback,但我不知道回调使用什么,回调定义在哪里 您可以使用节点的内置util.promisify,完全不需要使用async.map和async.js- const { promisify } = require('util') const fs = require('fs') const files = ['file1', 'file2', 'file3'] Promise.all(files.m

我对以下示例有一个问题:

这个例子调用fs.stat在数组的每个元素中使用item,callback,但我不知道回调使用什么,回调定义在哪里

您可以使用节点的内置util.promisify,完全不需要使用async.map和async.js-

const { promisify } = require('util')

const fs = require('fs')

const files = ['file1', 'file2', 'file3']

Promise.all(files.map(promisify(fs.stat)))
  .then(results => /* results is now an array of stats for each file */)
  .catch(err => /* err is the first error to occur */)
承诺是现代JavaScript环境中新的并发原语。它们可以很容易地用于所有需要节点样式错误第一次回调的场景,格式为err,res=>{…}。async.map就是这种情况

承诺缓解了臭名昭著的回调地狱带来的一系列问题。如果出于任何原因,您不能使用承诺,并且必须使用节点样式的回调,那么这可能有助于您的理解。我从完整的工作示例中学到了最好的东西,因此在不到50行的代码中,我们实现了asyncMap和一个示例异步函数,让您了解每一部分是如何发挥作用的-

const delayedDouble=x,回调=> setTimeout//延迟函数 =>//要延迟的函数 回调//调用回调函数 空//无错误 ,x*2//和结果 ,1000//将函数延迟1000毫秒 常量异步映射=arr,func,cb=> {const loop=res,i=>//创建一个命名循环 i>=arr.length//如果i超出范围 ?cbnull,res//不发送错误和最终结果 :func//否则调用用户提供的func arr[i]//使用当前元素 ,err,x=>//和回调 错误//如果有错误 ?cberr,null//立即发送错误,没有结果 :loop//否则继续循环 […res,x]//具有更新的结果 ,i+1//和更新的索引 返回循环//初始化循环 [//结果为空 ,0//和起始索引 } asyncMap//asyncMap的演示 [1,2,3]//示例数据 ,delayedDouble//带err,res回调的异步函数 ,err,res=>//异步映射的最终回调 错误//如果发生错误。。。 ? 控制台。错误'error',错误//显示错误 :console.log'result',res//否则显示结果 控制台。记录“请等待3秒…” //请等3秒钟。。。 //
//结果[2,4,6]可能倾向于should虽然我同意现在应该这样编写这样的代码,但它没有回答这个问题。@user633183这是一个很好的回答,但我的问题是关于map函数中回调的定义。我总是应该用承诺而不是回电。但是当我看到这个示例时,我找不到在完整示例中定义的回调在哪里,asyncMap为func提供了回调;您可以将其视为err,x=>。。。在代码段中。用户在调用站点提供的最终回调cb。这回答了您的问题吗?回调函数由异步库提供。您同样可以编写functionitem,callback{fs.statitem,callback;}您提供的链接还记录了iteratee(它是一个函数)和callback参数(它定义为err),结果。@Bergi我假设会发生类似的情况,但我在报告中没有发现任何东西documentation@FernandoLlallire您链接的文档表示迭代器应用于coll中的每个项,并通过项callback调用。回调参数是由库创建的,在库的内部某处定义。这有关系吗?
const { promisify } = require('util')

const fs = require('fs')

const files = ['file1', 'file2', 'file3']

Promise.all(files.map(promisify(fs.stat)))
  .then(results => /* results is now an array of stats for each file */)
  .catch(err => /* err is the first error to occur */)