Javascript 在异步模块内调用函数而不进行回调
我对以下示例有一个问题: 这个例子调用fs.stat在数组的每个元素中使用item,callback,但我不知道回调使用什么,回调定义在哪里 您可以使用节点的内置util.promisify,完全不需要使用async.map和async.js-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
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 */)