Tag: q

更好的方式来写这个承诺链

我在学习Node,并有一个函数recursion一个目录,并返回符合模式的文件的承诺。 这是工作相当不错,但我希望能够同时处理任何数量的types的文件,我链接的function是这样的: findFiles(scriptLocation, '.type1.').then(function (type1Files) { console.log('type1Files: ' + type1Files) findFiles(scriptLocation, '.type2.').then(function (type2Files) { console.log('type2Files: ' + type2Files) findFiles(scriptLocation, '.type3.').then(function (type3Files) { console.log('type3Files: ' + type3Files) }) }) }) 但是当我添加更多types时,它可能会变得很sl sl。 我试过了 Q.all([ findFiles(scriptLocation, '.type1.') , findFiles(scriptLocation, '.type2.') , findFiles(scriptLocation, '.type3.') ]).then(function(type1Files, type2Files, type3Files){ // all files returned in the first parameter… }) 我喜欢第二个版本的语法,但是它并不完全符合我的要求,因为结果不是单独返回,而是汇总成单个结果。 我使用Q作为我的承诺库。

如何使用Q-IO设置HTTP请求超时

我们使用Q和Q-IO将HTTP请求转换为承诺。 有时我们的要求会超时 – 对我们的口味来说太快了。 有没有办法设置这些“QHTTP”查询的超时时间? function promiseAQuery() { var QHttp = require( 'q-io/http' ); return QHttp.request({ url : 'http://www.domain.com/', method : 'GET' }); }

使用mongoose和Q.spread给出数组callback参数

我有下面的代码: var mongoose = require('mongoose'); var Q = require("q") mongoose.connect("mongodb://localhost/testdb"); var Schema = mongoose.Schema; var employeeSchema = new Schema({ name:String }) var Employee = mongoose.model('Employee', employeeSchema); var departmentSchema = new Schema({ name:String }) var Department = mongoose.model('Department', departmentSchema); var employee = new Employee(); employee.name = "T.Smith"; var dept = new Department(); dept.name = "Sales"; Q.spread([ […]

在使用q(promises)模块的Nodejs中,then()返回的值是多less?

我不是在问诺言的实现价值。 在这里我正在询问then()函数的返回值。 我所关心的具体事情是根据条件build立承诺清单,例如: function operationThatReturnsPromise() { var p = q.resolve({ prop1 : value1 }) .then(function(ctx) {…. return ctx;}); if (condition1) { // which usage is required or preferred? // 1. p = p.then() ? p = p.then(function(ctx) { ….. return ctx; } ); // 2. p.then() ? p.then(function(ctx) {… return ctx; }); } return p; […]

我怎样才能解决这个Q.denodifytesting?

我正在使用一个数据库库,其基于callback的界面如下所示: var DB = { insert: function(options, callback) { } } 我想实现一个包装这个数据库来将其callback风格API转换为基于承诺的API。 要做到这一点,我已经定义了以下类: var DatabaseWrapper = { init: function(db) { this.db = db; }, insert: function(options) { return Q.denodeify(this.db.insert.bind(this.db))(options); } } 我想写一个unit testing,以确保当我调用DatabaseWrapper.insert它调用DB.insert 。 到目前为止,我的testing如下所示: describe('DatabaseWrapper', function () { var wrapper, insertSpy, bindStub; beforeEach(function () { wrapper = Object.create(DatabaseWrapper); insertSpy = sinon.spy(function () { console.log('insertSpy […]

在试图在nodejs上的asynchronous承诺链上使用未定义的variables时,在控制台或日志中没有uncaughtException

我注意到一些很奇怪的东西: 在asynchronous承诺链上,当我错误地尝试logging一个不存在的variables时,它创build了一个我在控制台中看不到的exception。 当我以同步的方式调用完全相同的函数(直接从方法中调用,而不是由于parsing的promise链asynchronous激活),它显示了预期的错误(请参阅下面的堆栈跟踪的例外情况)。 这使我疯狂,因为承诺链激活了方法(我可以看到它开始通过我开始添加的日志行来做事情),但是然后到达有问题的日志行,停止了整个方法实现其目标,但没有打印错误,也没有看到堆栈跟踪。 这使得整个debugging问题非常复杂,我相信我在这里做错了什么。 但是这是什么? 这是我使用的代码:(我标记写得不好的variables) module.exports = { sync: function(){ console.log(doesNotExist); // error logs }, async: function(){ Q().then(function(){ // actually from an API returning a promise console.log(doesNotExist); // no error in log or `unhandledException` process event }); } }; 更新:利用本杰明的解决scheme后 process.on("unhandledRejection", function(r, e){ console.log("Oh No! Unhandled rejection!! \nr::", r,"\ne::", e); }); 事情变得更好了。 现在我得到一些日志打印,看起来像这样 […]

从承诺链的中间解决

在我的代码中,我使用Q库链接多个API调用,如下所示: function long_promise_chain() { var q = Q.defer(); call_api_batch1() .then(function(v) { if (v.bar) { q.resolve(); } else { return call_api_batch_2(); } }) .then(function(v) { if (v.bar) { q.resolve(); } else { return call_api_batch_3(); } }) .then(function(v) { if (v.bar) { q.resolve(); } else { return call_api_batch_3(); } }, function(err) { console.log("err: " + err); }); […]

什么是最好的方法使用Q承诺循环? 在迭代到下一个之前等待链完成

我有以下情况: var ids = [120, 121, 122, 123, 124] function dummyPromise(pause) { var deferred = Q.defer(); setTimeout(function() { console.log(pause); deferred.resolve(pause); }, pause); return deferred.promise; } for(var i = 0; i < ids.length; i++) { dummyPromise(ids[i]) .then(dummyPromise) .then(dummyPromise) .then(dummyPromise) .then(dummyPromise) .done(function(){ console.log('done') }) } 我想在迭代到下一个之前等待链完成。 什么是最好的方法来解决这个问题?

NodeJS我的SQL查询与链承诺

我有3个function,我想调用这个function一步一步,例如,当我将调用第一function和得到的结果,我不得不调用第二个function,并传递从第一次调用返回的参数。 在完成第二次调用之后,我必须调用第三个函数并传递从第二个函数返回的参数。 #1: getCategory = function (branch_id) { var deferred = q.defer(); var categoryData; var query = 'SELECT id,name,price,currency FROM category where branch_id=?'; pool.getConnection(function (err, connection) { connection.query(query, [branch_id], function (error, row, fields) { if (error) { deferred.reject(error); } else { connection.release(); deferred.resolve(row); } }); }); return deferred.promise; } #2: getRoom = function (branch_id, categoryID) […]

我如何链接与Q的嵌套承诺? 我无法让他们按照正确的顺序运行

我希望能够链接自己可能包括链式方法的方法。 日志应该是“第一,第二,第三”。 但实际上却是“第二,第三,第一”。 我知道这个代码有点多余,但我只是想了解promises / node如何执行。 我将如何编写可以链接在一起的基于承诺的函数? user.increaseReadings(id) .then(function(val) { console.log("second",val); return user.findById(id); }) .then(function(val) { console.log("third",val); res.json(val); }); } 从/models/user模块: exports.findById = findById; function findById(id) { deferred = Q.defer(); User.findById(id, function(err, doc) { if (err) return deferred.reject(err); deferred.resolve(doc); }); return deferred.promise; } exports.increaseReadings = increaseReadings; function increaseReadings(id) { deferred = Q.defer(); findById(id).then(function(doc) { <– […]