Tag: q

用Q承诺处理数据库断开连接

我正在构build一个使用Q promise与MongoDb进行MongoDb的node.js应用程序。 我试图让它更容错 – 所以,如果MongoDb服务器宕机 – 我的应用程序检测到它,并尝试重新连接 连接初始化为 this.db = Q.nfcall(Mongodb.connect.bind(Mongodb), config.mongoServer).catch(function(){ console.log('could not connect..'); }); 然后偶尔读取或写入链接否this.db承诺 this.db .then(function(db) { var collection = db.collection(pair); return Q.nfcall(collection.mapReduce.bind(collection), map, reduce, { out: { inline: 1 }, query: query }); }); 如果MongoDb服务器在连接诺言完成后closures – 它从来没有进入catch语句。 即使再增加一个接口来进一步保证没有断开连接的错误 有什么build议吗?

Q.传播和厄运的金字塔

我有这个代码: Q.spread([ Q.nfcall(employee.save.bind(employee)), ],function(emp){ Q.spread([Q.nfcall(dept.save.bind(dept))],function(dept){ console.log("success") },function(e){ console.error(e); mongoose.disconnect(); }) },function(e){ console.error(e); mongoose.disconnect(); }) 虽然效果很好,但它开始看起来像厄运的金字塔。 有没有一种方法来重构它更“有前途”? 我期望这样的工作: Q.spread([ Q.nfcall(employee.save.bind(employee)) ]).then(function(emp){ var dept = new Department(); return Q.spread([ Q.nfcall(dept.save.bind(dept)) ]) }).then(function(dept){ console.log("success"); }).catch(function(e){ console.error(e); }) 但事实并非如此。

如何使用Q库,同时转换节点asynchronousfunction承诺?

如何在下面的代码中使用Promise? function async_f1(callback) { setTimeout(function() { callback("Async function 1…"); }, 1000); } function async_f2(callback) { setTimeout(function() { callback("Async function 2!…"); }, 1000); } function async_f3(callback) { setTimeout(function() { callback("Second async function 3!…"); }, 1000); } function doAll() { async_f1(function(result1) { async_f2(function(result2) { async_f3(function(result3) { console.log("Final result:", result1 + " " + result2 + " " […]

从Q Promise开始顺序运行

我有这个代码,我希望这两个Promise按顺序运行,结果应该是这样的: a progress: 20 a progress: 40 a progress: 60 a progress: 80 a progress: 100 a resolve: a b progress: 20 b progress: 40 b progress: 60 b progress: 80 b progress: 100 b resolve: b 但我得到这个: a progress: 20 b progress: undefined a progress: 40 b progress: undefined a progress: 60 b progress: […]

在承诺范围之外发送连接范围之外的事件

我正在做一个婚介web应用程序,我使用ExpressJs , Redis和Socket.io 。 故事 : 我用你的用户名,任务名称和难度提交一个表单(用AJAX) 我循环所有与选定任务相关的团队,并确定哪一个可用 然后我想添加当前的“客户端”到一个频道(选定的团队),我想广播一条消息给频道的所有用户,如: client.join(team); io.in(team).emit('matchmakingInProgress', teamData); 事实是,我使用Promise为了避免大callback地狱,我没有访问这些variablesio和套接字,因为它们预先使用,我正在寻找一种方式来检索它们。 app.js var express = require('express'), app = express(), server = require('http').createServer(app), io = require('./events/sockets').listen(server), port = process.env.PORT || 8080 ; // other stuff here … app.use(require('./controllers')); server.listen(port, function() { console.log('Listening on port ' + port) }); 事件/ sockets.js var socketio = require('socket.io'); […]

Nodejs + Q promise +方法根据urltypes返回

我使用节点js作为后端,也使用q promise包。 问题:我正在尝试获取第三方产品详细信息。 1. www.abcd.com 2. www.xyz.com – 这个方法我在后台处理。 可能的url: ?本地主机:8080 /searchtypes= “ABCD”; ?本地主机:8080 /searchtypes= “XYZ”; 本地主机:8080 /search; 如果上面的URLtypes是abcd,则意味着需要search一些不同的thridparty(www.abcd.com)http url; 如果上面的URLtypes是xyz,则意味着需要search其他一些不同的thridparty(www.xyz.com)http url 如果上面的URL没有获得types意味着需要searchwww.abcd.com,如果结果find意味着然后返回响应,如果结果未find意味着需要调用www.xyz.comurl,然后返回响应。 (注意 – 这里有两个第三方API需要调用) 码: router.get('/search', function(req, res, next) { if (!( typeof req.query === 'undefined' || req.query === null || req.query == "")) { var type = req.query; } var spec = […]

将Selenium的findElements中的承诺数组转换为对象数组

我正在使用Selenium node.js我正在尝试执行以下操作 var driver = *webdriver instance*; var my_xpath = *an xpath string*; var ele; Q.all(driver.findElements(webdriver.By.xpath(my_xpath))).then(function(elements) { for (ele in elements) { console.log(ele.getText()); }; } 我的印象是, Q.all会将由driver.findElements返回的driver.findElements的数组转换成一个值的数组,这样当我输出ele.getText() ,它将是一个值。 然而,在这种情况下, ele仍然是一个承诺。 我在这里错过了什么? 请注意,我认识到,对于上述例子,这是不必要的,我可以简单地使用ele.getText().then ,但我的实际程序需要所有的值之前继续。

Q不能正确链接

我尝试链接承诺。 下面的getExternalMap()返回一个promise(处理ajax call => deferred.resolve()并返回deferred.promise)。 “第一链”被称为没有问题,但“二链”不叫,为什么? 我认为这是写得很好,但不是,我也找不到为什么。 var self = this; getExternalMap().then(function() { console.log("First chaining"); var parsedMap = self.destinationsApiParser.getSortDestinations(); return self.initProxies(parsedMap); }).then(function() { console.log('second chaining'); }); this.initProxies = function(parsedMap) { var deferred = Q.defer(); var destinationsApiProxy = new DestinationsApiProxy(this.app, parsedMap); deferred.resolve(); return deferred.promise; }

使用Q处理exception的node.js

我一直在使用节点几个月。 对于asynchronous代码中的error handling,我一直遵循我所知道的最佳实践 ,即通过callback错误参数来处理错误,并让大多数exception冒出来并使应用程序崩溃,因为没有真正的一个干净的恢复方式。 我现在正在和一个使用Q的开发人员一起工作,他正在使用Q.nfbind来调用一些基于callback的函数。 但是,这给我头痛的error handling。 例如,假设我有一个可以callback的错误的函数: function doSomething(x, callback) { dbpool.acquire(function(err, conn) { if (err) return callback(err); conn.query('INSERT INTO some_table (x) VALUES (?)', [x], function(err, result) { dbpool.release(conn); if (err) return callback(err); callback(null, result.insertId); }); } var qDoSomething = Q.nfbind(doSomething); 随着QI可以然后调用qDoSomething并处理错误确定: qDoSomething('abc') .fail(function(err) { … }); 现在假设我工作得太晚了一晚,并且在查询之前在我的doSomething()函数中检查了这样的代码: var foo; foo.doAnotherThing(); 在我的前Q世界,这将是不好的。 将抛出exception,这将导致应用程序崩溃,并将永远重新启动。 但是,一旦应用程序重新启动,它将至less有效,直到此代码path再次被击中。 […]

Node.js / q为什么这个函数没有被调用?

我有这个代码: /** * On message received */ socket.on('message', function (message) { global.logger.info('%s : message : %s', address.address, message); execute(message, socket) .then(function (value) { global.logger.debug('%s : success : %s', address.address, value); socket.emit('message', message); }, function (error) { global.logger.debug('%s : fail : %s', address.address, error); socket.emit('error', error); }); }); function execute(message, socket) { global.logger.debug('Got here : %s', […]