Tag: callback

Node.jsasynchronouseachLimit如何在这种情况下工作?

我写了一个小async脚本来批量插入大量的JSON文件到MongoDB分片集群中。 这是我第一次使用这个模块(而且我还在学习Node.js)。 我不知道我是否做对了。 该代码是瀑布(1)的最后一部分:以前的函数结束与db , coll和files属性的对象。 files数组包含数百个文件path,并且应用于数组的每个元素的函数又是一个瀑布(2)。 瀑布(2)由以下内容组成:读取,parsing,插入。 当这个瀑布结束时(3)我调用complete完成数组中单个项目的处理,传递错误(如果有的话)。 到目前为止这么好,对吗? 我不明白的是在async.eachLimitcallback(4)内发生了什么。 从文档: 在所有迭代器函数完成之后调用的callback,或发生错误。 也就是说,当所有函数完成后, next()调用(5)结束脚本。 但是,当按照文档发生单个错误时,会调用相同的callback函数(4)。 这是我的脚本停止时发生单个文件的失败。 我怎样才能避免这一点? async.waterfall([ // 1 // … function (obj, next) { async.eachLimit(obj.files, 1000, function (file, complete) { async.waterfall([ // 2 function (next) { fs.readFile(file, {}, function (err, data) { next(err, data); }); }, function (data, next) { // Parse […]

在所有当前计划的callback被执行之后调用一个函数(节点)

我正在使用stream式multipart/form-dataparsing器来处理文件和字段上传。 每当一个新的字段或文件被parsing,一个事件被触发,我执行一些处理。 在所有的字段和文件被parsing后,一个'close'事件被触发,然后我调用请求的终止函数。 这是设置。 parser.on('fields',function(){ handleField(callback); }); parser.on('close',function(){ dismiss(); }) 问题是,处理一个字段可能需要一些时间,这使得'close'侦听器在我有机会从字段处理侦听器调用callback之前closures请求。 我试图使用根据其描述的setImmediate函数 在I / O和定时器callback之后将其callback排队在事件队列中。 为了让我的dismiss()函数在所有当前计划的callback被执行之后被调用,但是没有工作,我甚至尝试了process.nextTick()以防止我的顺序颠倒,但没有这样的运气。 所以问题是,只有在调用处理函数的所有当前计划的callback之后,我怎样才能调用我的dismiss()函数呢?

我应该如何批量上传到s3,并通过最终callback从nodeJS webserver插入到MongoDB?

我有一个Web服务器,接受来自客户端的图像,处理它们,将它们上传到S3,批量插入到我的mongoDB,最后发送到客户端的JSON结果。 使用单个图像的工作如下: router.post("/upload", function(req, res){ var form = new multiparty.Form(); form.parse(req,function(err,fields,files){ s3.upload({ Key: filename, Bucket: bucketname, ACL: "public-read", Body: fs.createReadStream(filepath) }, function(err, data){ if(err) //error handle Model.collection.insert({"name": "name", "url" : data.Location}, function(err, result){ if(err) //error handle res.json({result: result}) }) }) }) }) 这工作得很好,因为我简单地上传文件数据到s3 – >完成后,插入s3的输出(url)到数据库 – >完成后,将mongo的结果作为jsonarray发送到客户端。 问题是 – 我的客户端HTML除了多个type=fileinput相同的name=images ,以便我可以在我的表单parsing器中访问它们作为images[i] 。 上述algorithm重复images.length次。 当我不得不等待所有的asynchronousS3上传 – […]

如何确定一个callback将被同步执行还是asynchronous执行?

我正在学习node.js. 到目前为止,我已经理解了callback是什么意思,但是我不确定callback是否将被同步执行(调用者不会继续前进直到callback返回)或者asynchronous(调用者进行callback并继续执行其代码)。

Mongoose 4.x“model.update()”callback已更改

在mongoose 4.x之前,在update()中,你可以检查callback中的第二个参数来查看文档是否被find。 在下面的示例中,可以使用“rowAffected”来查看是否存在具有用户名john的文档。 model.update({ username: "john" }, { … }, function(err, rowAffected){ if (rowAffected) // document found 但是现在从mongoose 4.x中,callback中的第二个参数成为了更新操作的MongoDB的原始输出。 所以要find文件是否存在,我必须做raw.n model.update({ username: "john" }, { … }, function(err, raw){ if (raw.n) // document found 我的问题是“rowAffected”和“raw.n”是一回事吗? 如果是这样,从3.x迁移到4.x时,replaceraw.n中的所有rowA是否安全?

如何在node.js中执行callback函数?

我刚刚开始学习node.js,并且在express.js网站上的“hello world”示例中出现了一些令我困惑的东西。 在这个例子中,他们引用了callback函数中的服务器variables。 var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('App listening at http://%s:%s', host, port); }); app.listen()在执行callback函数之前是否向服务器variables返回一个值? 它如何做到这一点,它是如何工作的? 节点(和JavaScript)中的所有callback函数都是一样的吗? 我只想简单地解释执行过程。 要清楚,我明白,callback函数有权访问服务器variables。 但是,如果app.listen方法在向服务器variables返回一个值之前执行callback函数,那么当您尝试访问server.adress()时,是不是表示服务器variables仍然未定义? 那是我不明白的。

meteor.js – 如何检查asynchronouscallback的值

CONTEXT 我做了一个调用,如果成功,将布尔值从false更改为true。 然后,在这个调用之外,我检查这个布尔值是否为真,如果是的话,我路由到另一个页面。 问题 控制台日志指出,在调用有时间改变布尔值之前,正在执行检查布尔值的if语句。 我意识到这是由于asynchronous性,但不知道这是什么正确的devise模式。 这是一个片段: //set variables to check if the even and user get updated or if error var eventUpdated = false; Meteor.call('updateEvent', eventId, eventParams, function(error, result){ if(error){ toastr.error(error.reason) } else { var venueId = result; toastr.success('Event Info Updated'); eventUpdated = true; console.log(eventUpdated) } }); console.log(eventUpdated) if (eventUpdated) { Router.go('/get-started/confirmation'); } 可能的解决scheme […]

NodeJScallback – 访问“res”

我正在使用Express框架,并在我的一个路由文件中有以下内容: var allUsersFromDynamoDb = function (req, res) { var dynamodbDoc = new AWS.DynamoDB.DocumentClient(); var params = { TableName: "users", ProjectionExpression: "username,loc,age" }; dynamodbDoc.scan(params, function (err, data) { if (err) { console.error("Unable to query. Error:", JSON.stringify(err)); res.statusCode = 500; res.send("Internal Server Error"); } else { console.log("DynamoDB Query succeeded."); res.end(JSON.stringify(data.Items)); } }); } 我在我的一个路线中使用上面的函数: router.get('/users', allUsersFromDynamoDb); 现在我在调用dynamodbDoc上的“scan”时定义的callback函数,如果定义为一个单独的函数,可能会非常有用。 […]

使用asynchronous和请求模块限制请求

我将asynchronous和请求模块组合在一起,以asynchronous方式和速率限制来发出api请求。 这是我的代码 var requestApi = function(data){ request(data.url, function (error, response, body) { console.log(body); }); }; async.forEachLimit(data, 5, requestApi, function(err){ // do some error handling. }); 数据包含我要求的所有url。 我使用forEachLimit方法将并发请求的数量限制为5。 这段代码会使第5个请求停止。 在asynchronous文档中,它说:“迭代器传递一个callback函数,一旦完成,就必须调用它”。 但是我不明白,我该怎么做来表示请求已经完成?

有JavaScript内存泄漏recursion调用callback函数?

比方说,例如,您正在编写一个程序,等待队列中的消息,对其进行处理,然后等待下一条消息,并且这个消息永远持续下去。 在像C或Java这样的语言中,它看起来像这样: void processMessage() { while (true) { // waitForMessage blocks until the next message is received msg = waitForMessage(); // handle msg here } } 在Javascript(我使用node.js,顺便说一句),因为使用callback,它通常看起来像这样: function processMessage() { waitForMessage(function(msg) { // handle msg or error here processMessage(); }); } 我的担心是,你基本上有一个callback链recursion调用原来的function,这样做的开销可能会慢慢地消耗内存。 我猜这实际上不是一个问题,因为也许JavaScriptcallback独立存在于自己的堆栈上,而不是推到原始函数堆栈上? 有人向我解释了JavaScriptcallback和范围,并向我保证,在运行时间长达任意长时间的情况下,JavaScript代码不会耗尽内存,同时接收到任意大量的消息