Tag: asynchronous

如何在Connect中间件里面对mongoDB进行asynchronous调用?

比方说,我有以下的Express / Connect中间件: return function(req, res, next) { mongoose.connect(url, options); var Config = mongoose.model('Config', mongoose.Schema({ field1: Boolean, field2: [] })); Config.findOne({}, function (err, doc) { if(!err) { if(someCondition) // some logic: send response and interrupt middleware chain res.end('Some response'); else next(); } } }; 问题是数据库调用是asynchronous的。 所以中间件函数在执行任何逻辑之前退出。 任务很简单:从mongoDB读取configuration,如果某个字段值=“某些”发送响应,否则 – 继续中间件链。 所以,我现在有两个问题 : 有没有办法在中间件内部进行asynchronous调用? 如果没有,是否有任何解决方法? (AFAIK,没有办法同步执行数据库调用)

node.jsasynchronous函数的可读性

我明白,我们不应该在node.jsasynchronous函数中返回对象,并且asynchronous函数中的每个path都应该导致callback函数。 为了在一定程度上解决“厄运金字塔”问题,并为了更好的可读性,只要说“回报”就可以了。 在调用callback函数之后,我不必将剩余的代码放在else块中,并跳过缩进并获得更好的可读性。 代码一直工作得很好,但只是想知道是否有任何潜在的问题,我忽略。 (function(database) { var mongodb = require("mongodb"); database.ObjectID = mongodb.ObjectID; var mongoUrl = "mongodb://localhost:27017/mydb"; var dbconn = null; database.getDBConn = function(next){ if(dbconn){ next(null, dbconn); return; } //already connected: return dbconn mongodb.MongoClient.connect(mongoUrl,function(err, database){ if(err){ next(err, null); return; } //connection fail: return error dbconn = {db: database, movies: database.collection("movie") }; next(null, dbconn); //connection success: […]

有没有等效的asynchronous库,但对于node.js的child_processes

在节点中stream行的asynchronous库在处理asynchronous函数的复杂控制结构方面做了很多工作。 例如,假设我有一个银行帐户ID的集合,我想从一个API中检索余额,然后对余额进行求和。 我可以通过做这样的事情来实现asynchronous: var accountIds = [0001,0002,0003,0004,0005,0006] async.mapLimit(accountIds, 3, function fetchBalance(accountID, cbk) { var balanceURL = "http://someapi.com/account/balance/" + accountID; get(balanceURL, cbk); }, function end(err, balances) { if (err) { console.err(err); } console.log(sum(balances)); } ); 这使我不必编写pipe道,以跟踪同时分派多less个asynchronous函数,确保所有函数最终完成,跟踪错误等。另外,它在节点中工作良好,因为I / O(以networking请求)是这个程序的限制因素。 但是,让我们设想一下,不是有单独的任务是I / O绑定的,我们有单独的CPU绑定任务。 asynchronous不会给我任何真正的性能好处,因为node.js只会运行一个主线程。 在节点中并行处理这种工作负载的一种解决scheme可能是使用child_process库并生成一堆工作进程来处理CPU绑定的工作。 我的问题是,是否有一个库可以处理这些工作stream的pipe道/协调,如asynchronous为I / O绑定,asynchronousfunction? 如果没有,这是否值得写? 我认为这可能是一个有趣的练习。

嵌套承诺陷入困境

以下代码卡住了: var Promise = require('promise'); var testPromise = function(){ return new Promise(function(fulfill, reject){ element.all(by.repeater('item in menu.items')).first().then(function(el){ console.log('test f'); fulfill(el); console.log('test fe'); }); }); }; …被以下所称: testPromise().then(function(el){ console.log('test successful '+el); }); 控制台打印 test f test fe 并没有更多的代码被执行。 它永远不会达到那个尽pipe履行被称为。 如果使用嵌套promise是一个反模式,那么如果没有嵌套promise,我该怎么做: var getMenuItemEl = function(itemName){ return new Promise(function(fulfill, reject){ var elFound; element.all(by.repeater('item in menu.items')).then(function(els){ async.each(els, function(el, callback){ el.getText().then(function(text){ […]

NodeJS使用条件语句顺序asynchronous

是否有可能编写NodeJS代码,以顺序方式执行几个asynchronous步骤,其中一些步骤是基于条件语句执行还是绕过? 让我试着用伪代码写一个例子。 想象一下你有类似的东西 step1.then(step2).then(step3); 现在让我们添加一个选项: var opt = true; 怎么可能做到这样的事情: step1.then(opt && step2).then(step3); 或者,如果我们在中间说了两个不同的可能步骤: step1.then(opt ? step2 : step3).then(step4); 编辑 如果可选步骤是在开始呢? (opt && step1).then(step2).then(step3); 如果有人能够提出一些build议或提出build议,那将是非常棒的! 谢谢

通过非阻塞代码阻止代码有什么优势?

我正在学习JavaScript和Node。 我明白asynchronous的东西如何工作。 我明白为什么它可以显着加快速度。 我发现其他语言(如Ruby和Java?)被devise为阻塞。 为什么? 我有一个模糊的想法,你可以使用线程来处理事情需要很长时间的情况。 这是asynchronous做事的优点和缺点?

有没有替代弃用的deferred.callback?

问题 我发现以下相当详细的模式通常出现在我的代码中,当我包含给我很难promisify对象的库: var object = crummyLibrary.create(); return new Promise(function(resolve, reject){ object.method('foo', function(err, bar){ if(err){ reject(err); }else{ resolve(bar); } }); }); 对于Promise.defer()这个过去并不那么冗长: var deferred = Promise.defer(); object.method('foo', deferred.callback); return deferred.promise; 但现在已经废弃了(出于很好的理由),但是我还没有find这个模式的一个很好的替代品。 我知道有这样的: return Promise.promisify(object.method, object)('foo'); 但是,由于context / receiver的传递,它感觉很尴尬。 我在找什么 我希望能取代旧的deferred.callback ,也许是沿着以下的路线: var promise = new Promise; object.method('foo', promise.callback); return promise; 或者可能: return new Promise(function(resolve, reject, callback){ […]

节点的模块asynchronous不能按预期工作

我试图使用节点的模块“asynchronous”,其方法“每个”,以便使用array.forEach的asynchronous版本。 问题是它没有按预期工作,因为它从来没有执行callback,我把它作为第三个parameter passing。 代码如下: var async = require('async'); var arr = [1,2,3,4,5,6,7,8,9,10]; async.each(arr, function(element, cb){ console.log(element); }, function(err){ console.log("Done"); }); 事实上,我的程序从不打印“完成”,即使它完成循环数组。 你有什么主意吗?

将asynchronous工作stream更改为Promise(Bluebird)

我一直在试图把我的头围绕诺言。 对于我理解的基本概念,一旦嵌套,我有点困惑。 任何反馈意见 这里是我试图重构到承诺(蓝鸟)的代码 var getIndividualData = function(url, doneGetIndividualData) { var $, data; request(url, function(err, res, body) { if (!err && res.statusCode === 200) { $ = cheerio.load(body); data = { title: $("#itemTitle").children()["0"].next.data, condition: $("#vi-itm-cond").text(), price: $("#prcIsum_bidPrice").text(), imgUrl: $("#icImg")[0].attribs.src, createdAt: chance.date(), likes: chance.integer({min: 0, max: 1000}) }; doneGetIndividualData(null, data); } else { doneGetIndividualData(err); } }); […]

如何在asynchronous操作中指示“完成”

给定这个代码在指定的目录和子目录中的文件,我怎么去指示操作完成? function walkDirs(dirPath) { var fs = require('fs'), path = require('path'), events = require('events'), count = 0, emitter = new events.EventEmitter(); function walkDir(dirPath) { function readDirCallback(err, entries) { for (var idx in entries) { var fullPath = path.join(dirPath, entries[idx]); (function statHandler(fullPath) { fs.stat(fullPath, function statEach(err, stats) { if (stats) { if (stats.isDirectory()) { walkDir(fullPath); } […]