Articles of 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,只是检查? 如果是这样的话,我应该怎么做?

是否有可能build立一个dynamic的任务列表nodejsasynchronous(瀑布,系列等…)

我正在从包含节点和边缘数据的mongo中收集一些信息。 首先我必须得到节点,这样我可以抓住它的边缘。 一旦我有一个边缘列表,然后回去,并抓住更多的节点(等..基于深度值)。 下面的代码是我如何尝试使用async.waterfall和任务列表的一个松散的例子。 最初我只有一个单一的任务,但是一旦我把我的第一个查询添加到任务数组。 不幸的是,这似乎并没有注册asynchronous,它不会继续处理我添加的任务。 有一个更好的方法吗? var async = require('async') var mongoose = require('mongoose') var _ = requrie('underscore') var Client = this.Mongo.connect(/*path to mongo*/) var Node = mongoose.Schema({ id : String, graph_id : String }) var Edge = mongoose.Schema({ id : String, source_id : String, destination_id : String }) var Nodes = Client.model('myNode', Node) […]

node.js async.eachSeries太早调用最终callback

这就是我想要的:我有一个称为结果的大数组。 该数组中的每个项目我想放在我的迭代函数,并将其保存到我的mongoDB(我省略了一些步骤,以及哪些不重要)。 这些项目中的每一个都被保存到数据库(或拒绝)后,我想console.log显示“全部完成”。 不幸的是,所有的完成都在调用系列后几乎立即显示,而其他所有内容仍在处理。 我该如何解决这个问题? 我正在使用称为“光”的模型mongoose,为了可读性,我省略了代码中的所有错误消息。 我为eachSeries部分使用node-async var async = require('async'); var results = [very big array] var iteration = function(row,callbackDone) { light.find({data: row.data}, function (err,entry) { if(entry.length) { callbackDone(); return console.log(entry + ' already exists'); } var newEntry = new light(row); newEntry.save(function (err,doc) { console.log(entry + ' saved'); callbackDone(); }); }); }; async.eachSeries(results,iteration, function […]