Articles of 承诺

使用Bluebird在承诺中包装Node.jscallback

如何在Bluebird中使用Promise包装Node.jscallback? 这是我想出的,但想知道是否有更好的方法: return new Promise(function(onFulfilled, onRejected) { nodeCall(function(err, res) { if (err) { onRejected(err); } onFulfilled(res); }); }); 如果只有一个错误需要返回,是否有更干净的方法来做到这一点? 编辑我试图使用Promise.promisifyAll(),但结果不被传播到then子句。 我的具体例子如下所示。 我正在使用两个库:a)sequelize,它返回承诺,b)supertest(用于testinghttp请求),它使用节点样式callback。 这里是没有使用promisifyAll的代码。 它调用sequelize初始化数据库,然后发出HTTP请求来创build订单。 Bosth console.log语句正确打印: var request = require('supertest'); describe('Test', function() { before(function(done) { // Sync the database sequelize.sync( ).then(function() { console.log('Create an order'); request(app) .post('/orders') .send({ customer: 'John Smith' }) .end(function(err, res) { […]

pipe理承诺依赖关系

我正在使用Node.js和Bluebird创build一些相当复杂的逻辑,包括解压缩结构化文件,parsingJSON,创build和更改多个MongoDB文档,以及在多个位置写入相关文件。 我也有相当复杂的error handling,这取决于发生错误时系统的状态。 我很难想出一个通过承诺来pipe理依赖关系的好方法。 我现有的代码基本上是这样的: var doStuff = function () { var dependency1 = null; var dependency2 = null; promise1() .then(function (value) { dependency1 = value; return promise2() .then(function (value) { dependency2 = value; return promise3(dependency1) .then(successFunction); }); }) .catch(function (err) { cleanupDependingOnSystemState(err, dependency1, dependency2); }); }; 请注意,在promise3之前不需要dependency1,并且error handling程序需要知道依赖关系。 对我来说,这似乎是意大利面代码(和我的实际代码是很多并行控制stream程更糟糕)。 我也读过,在.thencallback中返回另一个promise是一个反模式。 有没有更好的/更干净的方式来完成我想要做的事情?

如何保证node.js脚本处于活动状态,同时承诺正在解决?

我的脚本使用promise(使用q库)执行一些asynchronous任务。 运行摩卡testing工作正常。 但是从命令行运行脚本不会。 节点进程立即死亡。 var bot = require('./bot'); bot.getCategories().then(function (categories) { console.log('Found ' + categories.length + ' categories'); });

发电机function与蓝鸟和coexpression

我正在尝试使用节点0.12中的一些和声function,特别是尝试使用新的生成器function。 我正在用co(v4),bluebird和express(v4)这样做,就像这样: // … var fs = bluebird.promisifyAll(require('fs')); // … app.post('/test', co.wrap(function* (req, res, next) { var contents = yield fs.readFileAsync('/etc/hosts', 'utf8'); return res.send(contents); })); // … 根据它的文档,co.wrap返回一个正常的函数,它返回给定生成器函数的promise。 到目前为止,这是工作正常,但我不知道的是,如果a)我通过不等待返回的承诺的结果泄漏内存和b)如果我可能会失去一个exception抛出我的生成器函数,或一它使用的模块。 这是一个好方法吗? 你看到有什么不对吗?

使用node-redis和节点8 util.promisify

节点-v:8.1.2 我使用redis客户端node_redis与节点8 util.promisify,没有blurbird。 callbackredis.get是好的,但promisifytypes获取错误消息 TypeError:无法读取未定义的属性'internal_send_command' get(D:\ Github \ redis-test \ node_modules \ redis \ lib \ commands.js:62:24) 在get(internal / util.js:229:26) 在D:\ Github \ redis-test \ app.js:23:27 在对象。 (d:\ Github上\ redis的testing\ app.js:31:3) 在Module._compile(module.js:569:30) 在Object.Module._extensions..js(module.js:580:10) 在Module.load(module.js:503:32) 在tryModuleLoad(module.js:466:12) 在Function.Module._load(module.js:458:3) 在Function.Module.runMain(module.js:605:10) 我的testing代码 const util = require('util'); var redis = require("redis"), client = redis.createClient({ host: "192.168.99.100", port: 32768, }); let […]

触发事件触发事件

我的整个项目使用(蓝鸟)承诺,但有一个使用EventEmitter的特定图书馆。 我想实现这样的事情: Promise.on('connect', function() { x.doSomething(); }).then(function() { return new Promise(function(resolve) { y.doAction(resolve); // this will result in `eventB` getting emitted }); }).on('eventB', function() { z.handleEventB(); }).then(function() { z.doSomethingElse(); }); 我在Promises链的中间读到了EventEmitter的答案。 这给了我一个方法来执行“连接”事件的callback。 这是我到目前为止的地方 var p = new Promise(function(resolve) { emitter.on('connect', resolve); }); p.on = function() { emitter.on.apply(emitter, arguments); return p; }; p.on('connect', function() { x.doSomething(); […]

testing失败的承诺与摩卡的内置承诺支持

我应该怎样用摩卡和柴来testing我的诺言失败了? 我很困惑,因为我最初认为我应该使用'mocha-as-promised',但是这个包现在已经被弃用了(我正在使用mocha 2.1.0),build议只使用现在内置的promisevalidation摩卡。 请参阅: https : //github.com/domenic/mocha-as-promised 另一篇文章build议废除it()callback的“完成”参数 – 不知道为什么,因为我理解传入“done”参数是表示testing正在被asynchronoustesting的方式。 见: 我如何正确地testing摩卡和柴的承诺? 无论如何,我试图减less我的问题到下面的代码 – 请帮我修改这个,以便我可以testing我的承诺确实失败。 it.only("do something (negative test)", function (done) { var Q = require('q'); function makePromise() { var deferred = Q.defer(); deferred.reject(Error('fail')); return deferred.promise; }; makePromise() .then(done, done); });

与承诺Knex交易

我得到了正确的结果,实际上,这两个行动正在被视为一个单一的交易单位; 如果一个失败了,两个失败。 在这个代码示例中:我正在做一个事务 (1)插入(2)更新 我接近它的方式是将我的数据库操作嵌套在.then中。 我的问题是,如果这个代码是正确的意外? 我是新承诺和knex。 knex.transaction(function(t) { knex('foo') .transacting(t) .insert({id:"asdfk", username:"barry", email:"barry@bar.com"}) .then(function() { knex('foo') .where('username','=','bob') .update({email:"bob@foo.com"}) .then(t.commit, t.rollback) }) }) .then(function() { // it worked }, function() { // it failed }); 这工作,但我觉得我仍然做错了什么。 寻找意见。

对象方法与ES6 /蓝鸟承诺

我使用harmony标志在Windows上使用节点v0.11.14-nightly-20140819-pre 。 我有JavaScript对象,在其原型中定义了两个方法: function User (args) { this.service= new Service(args); } User.prototype.method2 = function (response) { console.log(this); // <= UNDEFINED!!!! }; User.prototype.method1 = function () { …………. this.service.serviceMethod(args) .then(this.method2) .catch(onRejected); }; function onRejected(val) { console.log(val); } Service对象的serviceMethod返回一个promise。 当我使用如下的User对象: let user = new User(args); user.method1(); this在对象的方法2中User一旦被调用一旦被调用then结束了undefined 。 我试过使用ES6和蓝鸟承诺实施。 为什么最终在这种情况下undefined ?

蓝鸟诺言串行迭代,并解决修改数组?

我有这个承诺,创build一个新的Item文件,如果没有在数据库中find,然后将其存储在以前创build的Collection文档.. Collection文档是数组中的第一个string,数组中的任何后续索引都将转换为一个或多个Item文档。 Promise.each “解决原始数组未经修改” ,所以Promise.each的最后一个return是呈现对象,但后来。然后生成原始数组.. 这是诺言(缩写为可读性): globalVar = true; collectionId = ""; var itemSeries = Promise.each(items, function(element) { if (globalVar == true) { return Models.Collection.findOneAsync({ "name": element }) .then(function(collection) { // promise chain similar to the following else.. // set the collectionId var to an _id }); } else { return Models.Items.findOneAsync({ "name": element }) […]