Articles of asynchronous

嵌套的asynchronous循环推送到不调用主callback的asynchronous队列

我有一个asynchronous队列,我正在推动哪些会做些什么。 我生成需要插入的项目的方法是通过几个嵌套列表形成一个数据对象。 队列结束了处理所有事情,但由于某种原因,我无法通过console.log('All done.')主要的callback。 我已经删除了大部分不必要的东西,只剩下asynchronous的东西。 我究竟做错了什么? 我错过了什么吗? var q = async.queue(function(task, callback) { console.log('hello ' + task); callback(); }, 2); function A(data) { B(data, function() { // THIS ISN'T getting called. console.log('All done.'); }) } function B(data, callback1) { var list = [[1,2], [3,4], [5,6]]; async.each(list, function(item, callback1) { async.each(item, function(i, callback2) { doWork(i, function() […]

数据库连接池处理节点js应用程序的最佳做法?

我指的是下面的node-postgres包,但我想这个问题是相当通用的。 有这样一个简单的例子 ,你1)从顶级http请求处理程序池中获取(连接)一个连接(客户端),2)做该处理程序内的所有业务,3)释放它回到池之后,重做。 我猜这个例子可以正常工作,但是一旦你的应用程序变得稍微大一些,这个问题就会很快出现。 我正在考虑这两个选项,但我不太确定… 在任何需要与db进行交谈的地方执行“获取客户端+工作+发布客户端”的方法。 这似乎是一个不错的select,但是不会导致每个顶级http请求吃掉多个连接/客户端(在我的项目的许多地方有并行的asynchronous数据库调用)? 尝试将一个全局共享引用分配给一个客户端/可通过require()访问的连接 这是一个好主意,实际上可行吗? 是否可以很好地处理在所有丑陋的情况下“回到池释放”(例如并行asynchronous的东西的错误)? 谢谢。

NodeJS在多次请求后无限期地挂起

我有一个nodeJS(v.0.10.23)代理连接到postgres数据库(node-postgres模块v2.1.0),以及返回各种json数据的pgpool-II。 回到当天,这是如何处理连接错误: var after = function(callback) { return function(err, queryResult) { if(err) { response.writeHead(500, _header); console.log("ERROR: 500"); console.log(err); return response.end(JSON.stringify({error: err})); } callback(queryResult) } }; 基本上它所做的是在没有错误的情况下消耗响应。 可以在这里find一个深入的解释: Node js – http.request()连接池的问题 使用上面的函数,我有这样的东西: pg.connect(_conString, after(function(err, client, done) { client.query(sql, after(function(result) { … done(); } 由于当函数传递到after()scallback函数时上下文丢失了,所以我放弃了使用pg.connect()传递的先天done()方法的能力。 删除后解决了这个问题,但随后,在适当的时间,并有相当数量的客户端拉数据,节点将挂起,直到它被重置。 是否有消耗各种asynchronous响应的不同方式? 或者可能是一种将pg.connect上下文传递给callback的方法?

使Meteor.methods同步和asynchronous

有时我需要Meteor.call来writeMeLater排队并同步执行(阻止来自同一个客户端的writeMeLater其他调用)。 其他时候writeMeLater的调用应尽快执行,而不排队等待当前排队的所有调用。 下面是我尝试使用this.unblock()如果一个async参数为true。 案例1和2工作正常。 但在案例3中,使用async=true调用在async=true调用后面排队! 我们如何使用async=true来调用跳过队列? 这与来自第二客户端的呼叫在来自第一客户端的呼叫之后没有排队是类似的, 所有的Meteor.call()都是由客户端创build的 情况1(正确同步): Meteor.call('writeMeLater', 's', false) Meteor.call('writeMeLater', 's', false) Meteor.call('writeMeLater', 's', false) 情况2(正确asynchronous): Meteor.call('writeMeLater', 'a', true) Meteor.call('writeMeLater', 'a', true) Meteor.call('writeMeLater', 'a', true) 情况3(不是所需的行为) Meteor.call('writeMeLater', 's', false) Meteor.call('writeMeLater', 's', false) Meteor.call('writeMeLater', 's', false) Meteor.call('writeMeLater', 'a', true) Meteor.call('writeMeLater', 'a', true) Meteor.call('writeMeLater', 'a', true) 服务器/ main.js writeMeLater = function(data, callback) { console.log('writeMeLater: […]

async.waterfall绑定上下文

我目前正在与node.js的Web应用程序工作,我不能找出库asynchronous的上下文问题。 这里是我的应用程序的代码的一个例子: notification.prototype.save = function (callback) { async.parallel([ // Save the notification and associate it with the doodle function _saveNotification (done) { var query = 'INSERT INTO notification (notification_id, user_id, doodle_id, schedule_id) values (?, ?, ?, ?)'; notification.db.execute(query, [ this.notification_id, this.user_id, this.doodle_id, this.schedule_id ], { prepare : true }, function (err) { return done(err); }); […]

Meteor wrapAsync同步执行,但从不返回

我试图用wrapAsync封装一个节点包中的函数。 filepicker = new Filepicker('API Key') filepickerStatSync = Meteor.wrapAsync(filepicker.stat, filepicker) result = filepickerStatSync(url); console.log('after') stat函数如下。 一切似乎工作正常…请求调用响应正确的结果,最后的callback被调用,整个事情同步执行/产量正确,据我所知…但同步调用永远不会返回和console.log ('之后')从未被击中。 我不认为我犯了同样的错误发生在这个问题上,因为我的函数有一个callback作为最后一个参数。 我也不认为解决scheme是在这个问题上,因为包装函数结束与调用错误和结果的callback,这应该是什么Meteor.wrapAsync在签名中寻找。 Filepicker.prototype.stat = function(url, options, callback) { callback = callback || function(){}; if(!options) { options = {}; } if(!url) { callback(new Error('Error: no url given')); return; } request({ method: 'GET', url: url+'/metadata?', form: { size: options.size || […]

Javascript运行asynchronous代码的每个项目的循环与承诺

我有一个函数,获取一个对象传入它的密钥和数据是一个数组。 我必须调用API来获取额外的信息,然后将其添加回到对象中,并返回整个对象。 我的第一个方法是不正确的,因为我试图从.then()传递数据,但这是错误的做法。 function asignChecklistItems(taskArray) { // get all the people's tasks passed in return new Promise(function(resolve, reject) { var promises = [] // Task Array: {"Person":[tasks,tasks,tasks]} for (var person in taskArray) { var individualTaskPerson = taskArray[person] // get the person's tasks for (var individualTask in individualTaskPerson) { // here we get each individual task […]

可以多个fs.write追加到同一个文件保证执行的顺序?

假设我们有这样一个程序: // imagine the string1 to string1000 are very long strings, which will take a while to be written to file system var arr = ["string1",…,"string1000"]; for (let i = 1; i < 1000; i++) { fs.write("./same/path/file.txt", arr[i], {flag: "a"}}); } 我的问题是, will string1 to string1000 be gurantted to append to the same file in […]

Javascript背景循环

假设我们有一个loop.js文件: longLoop().then(res => console.log('loop result processing started')) console.log('read file started') require('fs').readFile(__filename, () => console.log('file processing started')) setTimeout(() => console.log('timer fires'), 500) async function longLoop () { console.log('loop started') let res = 0 for (let i = 0; i < 1e7; i++) { res += Math.sin(i) // arbitrary computation heavy operation if (i % 1e5 === […]

asynchronous函数应该永远抛出?

我写了一个有许多asynchronous函数的库。 如果其中一个参数是错误的,则SYNCHRONOUS帮助器函数将引发错误: proto.makeParameters= function( filters ){ default: throw( new Error("Field type unknown: " + fieldObject.type ) ); break; } 在我的asynchronous函数中,当我使用它时,我有: proto.someAsyncFunction = function( cb ){ // Run the query try { var parameters = this.makeParameters( filters ); } catch( e ){ return cb( e ); } } 所以: asynchronous函数永远不应该抛出? (就像我做的那样) 现在,我正在捕捉所有的错误。 我更挑剔吗? 也许组成一个错误types,只是检查? 如果是这样的话,我应该怎么做?