Tag: 蓝鸟

自定义错误和蓝鸟捕获ErrorClass导致无意中的行为

我正在尝试实现自定义错误的模块。 应该可以使用这个模块在应用程序的require-statement中实例化一个单独的错误: var MyCustomError = require('custom-error')('MyCustomError'); 这是模块: 'use strict'; var _CACHE = {}; function initError(name) { function CustomError(message) { this.name = name; this.message = message; } CustomError.prototype = Object.create(Error.prototype); CustomError.prototype.constructor = CustomError; _CACHE[name] = CustomError; } function createCustomError(name) { if (!_CACHE[name]) { initError(name); } return _CACHE[name]; } module.exports = createCustomError; 上述的需求一class轮运作到目前为止。 现在,在我的服务中,我想明确地捕捉到这个错误: var MyCustomError = […]

蓝鸟promisify和callback没有错误的参数

我试图promisify不使用callback(err, data)模式的第三方库。 相反,他们总是返回callback(data)并throw错误。 Promise.promisifyAll(horse); var p = Promise.defer(); horse.drinkAsync() .error(function(data) { p.fulfill(data); }) .catch(function (err) { console.error('error occured', err); }); return p.promise; 用promise来包装这样一个行为的好方法是什么,仍然有它看起来不错,并允许捕捉抛出的错误? catch子句不触发,应用程序崩溃。

使用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是一个反模式。 有没有更好的/更干净的方式来完成我想要做的事情?

触发事件触发事件

我的整个项目使用(蓝鸟)承诺,但有一个使用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(); […]

对象方法与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 }) […]

以小批次同时运行承诺(每次不超过X)

asynchronous库具有像eachLimit这样的function,可用于在多个CPU内核上高效地分发大量作业,如下所示: var numCPUs = require('os').cpus().length; var exec = require('child_process').exec; async.eachLimit(someArray, numCPUs, function (value, done) { exec('something –input' + value, done); }, finalCallback); 这样可以避免一次使用过多的命令来重载系统,但是仍然会利用多个CPU。 我想要做同样的事情,但有了诺言。 在Bluebird API中 ,我看不出有什么明显的方式来用Async这样一种简洁而富有performance力的方式来进行这种批处理。 Bluebird(或一般的Promise)有没有一个好的模式? 或者我可以使用的任何其他实用程序库?

承诺和不规则的callback

我使用蓝鸟玩弄一个承诺控制stream程。 Bluebird提供了一个用于将常规callback函数转换为promise函数的.promisify()方法,但是当函数不规则时,我不清楚该怎么做。 例如requestjs请求的方法签名是 request(url, callback) 在哪里callback err, res, body 而不是常规的 err, res 我应该如何将这个转换成承诺?

蓝鸟警告“一个承诺是在一个处理程序中创build的,但没有从它返回”

我得到了关于不从蓝鸟返回创build的承诺的警告,我不明白为什么以及如何重写我的代码。 (我曾尝试阅读关于Bluebird API页面和反模式页面的警告,因为我怀疑这是我正在做的) 在我的view.js文件中: var express = require('express'), router = express.Router(), settings = myReq('config/settings'), Sets = myReq('lib/Sets'), log = myReq('lib/utils').getLogger('View'); router.get('/:setId/', function(req, res, next) { var setId = req.params.setId, user = req.user, set = new Sets(setId, user); log.info('Got a request for set: ' + setId); // The below line gives the warning mentioned set.getSet().then(function(output) { […]