Tag: asynchronous

什么是在“完成所有事情”之后退出node.js脚本的好方法

我的node.js脚本从数据库1的表中读取行,进行一些处理并将行写入数据库2。 一切完成后脚本应该退出。 我怎么知道一切是否完成,然后退出节点? 如果我有这样的callback函数: function exit_node() { process.exit(); } (编辑:同时显而易见,process.exit()也可以用db.close()来代替 – 但这不是什么问题。问题是在什么时候完成这个工作,即如何以及在哪里执行这个callback。) 但是把它附在某个地方并不容易。 从db1上次读取后不正确,因为处理和写入还是要发生。 将它附加到写入db2并不容易,因为它必须在最后一次写入之后进行连接,但每次写入都是独立的,不知道它是否是最后一次写入。 理论上也可能发生最后一次写入完成,但在此之前的另一次写入仍在执行。 编辑:对不起,我可以看到这个问题的解释不完整,可能令人困惑,但有些人仍然理解,下面有很好的答案。 请继续阅读评论和答案,它应该给你全部的图片。 编辑:我可以想到一些“阻塞”控制器机制。 脚本的不同部分为每个打开的“作业”向控制器添加阻止程序,并在作业完成后释放它们,并且当没有更多的作业者时,控制器退出脚本。 也许asynchronous可以帮助: https : //github.com/caolan/async 我也担心这会炸毁代码和逻辑不合理。

使用node.js函数确定成功/失败的函数async.retry

我正在研究node.js模块的asynchronous,但我有一些async.retry函数的问题。 根据其github文档 ,该function将继续尝试任务,直到成功或机会用完。 但是我的任务怎么能告诉成功或失败呢? 我试了下面的代码: var async = require('async'); var opts = { count : -3 }; async.retry(5, function (cb, results) { ++this.count; console.log(this.count, results); if (this.count > 0) cb(null, this.count); else cb(); }.bind(opts), function (err, results) { console.log(err, results); }); 我期望它运行,直到count === 1 ,但它总是打印这个: -2 undefined undefined undefined 那我该如何正确使用这个function?

Node.js实际上使用下面的多个线程吗?

在阅读了关于node.js的所有文献之后,我仍然回到这个问题,node.js本身是否利用了多个线程? 我认为答案是肯定的,因为如果我们使用简单的asynchronous文件读取示例,必须要做的工作来读取文件,但如果节点的主事件循环不处理这个工作,那必然意味着应该有一个POSIX线程运行在需要处理文件读取的地方,然后在完成时将callback放回到要执行的事件循环中。 所以当我们说Node.js在一个线程中运行时,我们实际上是否意味着node.js的事件循环只有一个线程? 还是我错过了这里的东西…..

node.js async.js nextTick vs setImmediate

我有一个大量使用async.js模块的大型node.js应用程序。 我有很多这样的代码: async.series([ function(callback){ sql.update(query, callback); }, function(callback){ if (something){ sql.update(query2, callback); } else{ callback(null); } } ]); 最大的问题是else语句中的同步callback。 我读了一段时间,你不应该这样做与async.js,因为它可能会导致意想不到的结果,但我不知道什么是最好的select。 我读过,我应该在一些地方使用process.nextTick,但现在我正在阅读,我们不应该使用它,它应该设置为立即。 有人能指出我正确的方向吗? 谢谢!

如何在grunt.initConfig()之前执行asynchronous操作?

现在我有我的Gruntfile设置来执行一些自动检测魔术,如parsing源文件来parsingroder中的一些PHP源,以dynamic地找出运行grunt.initConfig()之前我需要知道的文件名和path。 不幸的是, grunt.initConfig()似乎并不是要asynchronous运行,所以我没有办法让我的asynchronous代码执行之前,我可以调用它。 有没有一个技巧来完成这个或我必须重写我的检测程序同步? 在我的callback到达之前有没有简单的方法来阻止执行? 内部的grunt任务当然有this.async() ,但是对于initConfig()不起作用。 这是一个简单的例子: function findSomeFilesAndPaths(callback) { // async tasks that detect and parse // and execute callback(results) when done } module.exports = function (grunt) { var config = { pkg: grunt.file.readJSON('package.json'), } findSomeFilesAndPaths(function (results) { config.watch = { coffee: { files: results.coffeeDir + "**/*.coffee", tasks: ["coffee"] // … } }; […]

以小批次同时运行承诺(每次不超过X)

asynchronous库具有像eachLimit这样的function,可用于在多个CPU内核上高效地分发大量作业,如下所示: var numCPUs = require('os').cpus().length; var exec = require('child_process').exec; async.eachLimit(someArray, numCPUs, function (value, done) { exec('something –input' + value, done); }, finalCallback); 这样可以避免一次使用过多的命令来重载系统,但是仍然会利用多个CPU。 我想要做同样的事情,但有了诺言。 在Bluebird API中 ,我看不出有什么明显的方式来用Async这样一种简洁而富有performance力的方式来进行这种批处理。 Bluebird(或一般的Promise)有没有一个好的模式? 或者我可以使用的任何其他实用程序库?

在Javascript中通过一系列承诺传递状态的模式是什么?

我正在尝试学习一些关于Node和asynchronous编程的知识。 我阅读了有关Promises的信息,并试图在一个小型的项目中使用它们,这个小型的项目将服务A的用户从服务A复制到服务B.我很难理解如何在Promise之间传递状态 该项目是使用Promise库为NodeJS编写的 我目前的问题的一个简单的定义是: 如果post在服务B中不存在,则将用户的post从服务A复制到服务B. 这两种服务都提供了http API,它需要一个不可重复的用户标识来查找该用户的post,所以用户标识必须从用户名中查找。 所有的http调用都是asynchronous的。 这是一些伪代码,说明我如何将Promises链接在一起。 Promise.from('service_A_username') .then(getServiceAUserIdForUsername) .then(getServiceAPostsForUserId) .then(function(serviceAPosts) { // but what? store globally for access later? doSomethingWith(serviceAPosts); return Promise.from('service_B_username'); }) .then(getServiceBUserIdForUsername) .then(getServiceBPostsForUserId) .done(function(serviceBPosts) { // how do we interact with Service A posts? doSomethingThatInvolvesServiceAPostsWith(serviceBPosts); }); 有一些我曾经想过的事情: 在getPostsForUserId函数中引入getIdForUsername调用。 但是 ,我想按照“做一件事,做得好”的原则,尽可能简化每一个function单元。 创build一个“上下文”对象,并将其传递到整个链中,读取和存储此对象中的状态。 然而,这种方法使得每个function非常适合于一个链,因此很难单独使用。 有没有其他的select,build议使用什么方法?

JavaScript中的竞争条件与复合赋值

我不是在谈论涉及networking或事件的复杂的竞争条件。 相反,我似乎已经发现+=运算符在V8(Chrome 58或者Node 8)中不是primefaces的。 下面的代码旨在并行运行两个所谓的线程。 每个“线程”重复调用一个函数,该函数在睡眠几秒后返回其数字参数。 结果总结成一个累加器。 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // Return the passed number after sleeping that many seconds async function n(c) { await sleep(c * 1000); console.log('End', c); return c; } let acc = 0; // global // Call n repeatedly and sum up results async […]

循环内asynchronous调用

可能重复: 在node.js中协调并行执行 首先,手上伪代码: forEach(arrayelements) { asyncQueryFunction(function(qres) { //work with query results. }); } // finally, AFTER all callbacks did return: res.render("myview"); 怎么做? 如果这还不够清楚,我会解释一下: 我需要做一系列的“更新”查询(在mongodb中,通过mongoose),循环的文档ID列表。 对于我的数组中的每个id我将调用一个asynchronous函数,将返回查询结果(我不需要做任何事情,实际上)。 我知道我必须使用.forEach() JavaScript循环,但是只有当我的所有asynchronous查询完成后,我怎样才能执行我的“最终”callback? 我已经使用优秀的asynchronous库( https://github.com/caolan/async )来实现这种任务,当我有一个“有限”的一系列任务执行。 但我不认为我可以通过它一系列不同的function。 我可以吗?

如何编写一个node.js函数等待事件在“返回”之前触发?

我有一个不是 Web应用程序的节点应用程序 – 它在返回1之前完成了一系列asynchronous任务。在返回之前,立即将程序结果打印到控制台。 在返回之前,如何确保所有asynchronous工作都已完成? 我可以通过在调用res.end()之前完成所有完成的任务来完成类似于Web应用程序的任务,但是在让脚本返回之前,我没有任何要调用的最终“事件”的等价物。 看到下面我的(破碎)函数,试图等到callStack为空。 我刚刚发现这是一种无意义的方法,因为在进入processObjWithRef中调用的任何asynchronous函数之前,节点会等待processHub完成。 function processHub(hubFileContents){ var callStack = []; var myNewObj = {}; processObjWithRef(samplePayload, myNewObj, callStack); while(callStack.length>0){ //do nothing } return 1 } 注意:以前我已经尝试了很多次,用像async这样的库来实现这种行为(请参阅我的相关问题: 如何使这个调用请求在nodejs中同步? ),所以请在提出任何build议之前将其答案和注释考虑在内基于“只使用asynchronous”的答案。