Tag: 蓝鸟

Mongodb节点驱动2.0。*与Bluebird 2.9。* promisification

所以围绕这个主题还有一些其他的疑问,比如: 我怎样才能使用蓝鸟提供MongoDB本地的Javascript驱动? 然而,它似乎并没有解决最新版本的驱动程序,这似乎有问题,当试图promisify时。 目前我可以通过执行MongoClient工作: Promise.promisifyAll(mongodb.MongoClient); // Using .Prototype here fails to promisify 然而,无论我尝试着什么,Collections似乎都不会使用*async调用操作,它可能会调用它们,但是它们永远不会被解决或被拒绝,所以它们只能被挂起。 历史上在以前的版本,你只会Promise.promisifyAll(mongodb) ,你已经完成了,但我不确定如何正确处理这个新的驱动程序。 下面是一个使用mongo direct promisification connectAsync创build的集合的示例输出,然后从返回的数据库获取集合。 一旦我尝试在集合上做任何事情,它只是挂起,承诺不会从它回来: { s: { pkFactory: { [Function: ObjectID] index: 14727641, createPk: [Function: createPk], createFromTime: [Function: createFromTime], createFromHexString: [Function: createFromHexString], isValid: [Function: isValid], ObjectID: [Circular], ObjectId: [Circular], createPkAsync: [Object], createFromTimeAsync: [Object], createFromHexStringAsync: [Object], isValidAsync: [Object], bindAsync: [Object], […]

用sinon和bluebird来保存一个promisifiedfunction

在我想testing的文件中,我有以下代码: var httpGet = Promise.promisify(require("request").get); httpGet(endpoint, { auth: {bearer: req.body.access_token}, json: true }) .then(…) 现在,在我的testing中,我想确保httpGet被调用一次,并确保参数是有效的。 在promisified之前,我的testing看起来是这样的: beforeEach(function () { request.get = sinon.stub() .yields(null, null, {error: "test error", error_description: "fake google error."}); }); afterEach(function () { expect(request.get).to.have.been.calledOnce(); var requestArgs = request.get.args[0]; var uri = requestArgs[0]; expect(uri).to.equal(endpoint); //… }); 不幸的是,当request.get被promisified时,这不再起作用。 我尝试刷新request.getAsync而不是(因为蓝鸟附加“asynchronous”promisifiedfunction),但是这也不起作用。 有任何想法吗?

蓝鸟承诺join行为

如果我用Node.js执行下面的代码 var Promise = require('bluebird'); Promise.join( function A() { console.log("A"); }, function B() { console.log("B"); } ).done( function done() { console.log("done");} ); 控制台将会logging B done 不过,我期望 A B done 要么 B A done 如果它在函数A中设置了一个断点,它永远不会到达。 为什么它处理B而不是A?

Mongoose with Bluebird promisifyAll – 对模型对象的saveAsync结果作为已解决的承诺值

我用蓝猫的promisifyAll与mongoose。 当我在模型对象上调用saveAsync(保存的promisified版本)时,完成的promise的parsing值是一个包含两个元素的数组。 第一个是我保存的模型对象,第二个是整数1 。 不知道这里发生了什么事。 下面是重现问题的示例代码。 var mongoose = require("mongoose"); var Promise = require("bluebird"); Promise.promisifyAll(mongoose); var PersonSchema = mongoose.Schema({ 'name': String }); var Person = mongoose.model('Person', PersonSchema); mongoose.connect('mongodb://localhost/testmongoose'); var person = new Person({ name: "Joe Smith "}); person.saveAsync() .then(function(savedPerson) { //savedPerson will be an array. //The first element is the saved instance of person //The […]

我如何使用Bluebirderror handling程序?

介绍 这个问题的目的是最终解决我在Bluebird开发中遇到的一个问题。 不过,我也借此机会澄清了一些事情,所以会有一些问题。 我也会提前道歉,在阅读故事的过程中,您可能会感受到任何混乱或无聊的感觉。 问题 据我的理解,蓝鸟试图聪明地捕捉到被忽略的拒绝,根据以下策略: 第二种方法,默认情况下是蓝鸟,如果拒绝未被第二回合开始处理,则调用注册处理程序。 – Bluebird自述文件#error handling 现在这里是第一个问题: “第二个回合的开始”是什么意思? 在同一部分的后面,logging如下: 当然,这不是完美的,如果你的代码由于某种原因需要猛扑一下,并且在承诺挂了一段时间之后附加了error handling函数,那么你会看到恼人的消息。 在这种情况下,您可以使用.done()方法来指示应该抛出任何悬挂exception。 – Bluebird自述文件#error handling 现在,我相信我碰到了上面描述的情况,我的用例如下: 我调用一个函数,它将为我提供附加.catch()的承诺: lib.loadUrls() .catch(function(e){console.log(e);}); 在内部,该函数从URL1加载内容并基于内容,依次从URL2加载内容: lib.loadUrls = return this.loadUrl1() .then(this.loadUrl2.bind(this)) 如果在这个链中的第二个承诺被拒绝,错误首先由catch处理,然后由Bluebirds处理,也Possibly unhandled error处理程序。 这最后一个行为是不需要的,我不明白为什么这样做。 所以问题二可能是: 为什么,尽pipe附加和执行error handling程序,蓝鸟仍然认为错误的可能性是“未处理”? 我在想,很明显,在拒绝传播给.catch()的时候,这个承诺“一直悬而未决”。 在这种情况下,我应该通过“使用.done() ”来解决它(根据引用的文档)。 现在,我已经尝试了几件事情,但是我不太清楚如何在这个场景中“使用.done”。 (这没有帮助.done()返回undefined,阻止我从.finally -ing。) 所以这就介绍了我的第三个和第四个问题: 在这种情况下如何使用.done() ,以及如何明确地结束承诺链,但仍然附加.finally() 编辑1:我创build了一些JSFiddles重现该错误: 使用蓝鸟1.0.5重现了错误。 使用最新的Bluebird.js再现了这个bug(在这个时候) 使用Beta版本0.10.0-1 不会重现该错误。 编辑2:开发人员修复了这个错误。

用蓝鸟承诺进行asynchronousexception处理

什么是处理这种情况的最佳方法。 我在一个受控制的环境中,我不想崩溃。 var Promise = require('bluebird'); function getPromise(){ return new Promise(function(done, reject){ setTimeout(function(){ throw new Error("AJAJAJA"); }, 500); }); } var p = getPromise(); p.then(function(){ console.log("Yay"); }).error(function(e){ console.log("Rejected",e); }).catch(Error, function(e){ console.log("Error",e); }).catch(function(e){ console.log("Unknown", e); }); 当从setTimeout中抛出时,我们总是会得到: $ node bluebird.js c:\blp\rplus\bbcode\scratchboard\bluebird.js:6 throw new Error("AJAJAJA"); ^ Error: AJAJAJA at null._onTimeout (c:\blp\rplus\bbcode\scratchboard\bluebird.js:6:23) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) 如果throw在setTimeout之前发生,那么bluebirds […]

用摩卡testing承诺链

我有以下风格的function(使用Node.JS下的蓝鸟承诺): module.exports = { somefunc: Promise.method(function somefunc(v) { if (v.data === undefined) throw new Error("Expecting data"); v.process_data = "xxx"; return module.exports.someother1(v) .then(module.exports.someother2) .then(module.exports.someother3) .then(module.exports.someother4) .then(module.exports.someother5) .then(module.exports.someother6); }), }); 我试图testing(使用摩卡,sinon,assert): // our test subject something = require('../lib/something'); describe('lib: something', function() { describe('somefunc', function() { it("should return a Error when called without data", function(done) { goterror = […]

在JavaScript中的思考诺言(蓝鸟在这种情况下)

我试图让我的头一些不那么微不足道的承诺/asynchronous使用情况。 在一个例子中,我现在正在摔跤,我有一个从一个knex查询(可数组)返回的书籍数组,我想插入到数据库中: books.map(function(book) { // Insert into DB }); 每本书的内容如下所示: var book = { title: 'Book title', author: 'Author name' }; 但是,在插入每本书之前,我需要从一个单独的表中检索作者的ID,因为这些数据是正常的。 作者可能也可能不存在,所以我需要: 检查作者是否存在于数据库中 如果是,请使用此ID 否则,插入作者并使用新的ID 但是,上述操作也都是asynchronous的。 作为插入操作的先决条件,我可以只使用原始映射中的承诺(获取和/或插入标识)。 但是这里的问题在于,因为所有东西都是asynchronous运行的,代码可能会插入重复的作者,因为初始的check-if-author-exists与insert-a-new-author块是分离的。 我可以想出几个办法来达到上述目的,但都涉及分拆承诺链,一般显得有些杂乱。 这似乎是一个相当普遍的问题。 我确定我在这里错过了一些基本的东西! 有小费吗?

如何promisifyAll工作,或者它的工作要求是什么?

在一个承诺库蓝鸟有函数promisifyAll或其他类似的库声称转换asynchronous函数与callback模式为基于承诺的,即。 resolve() , reject() ,或done() ..所以它是如何工作的? 例如: function myAsync1 (data, url, callBack) {…} 如果我把它放进去 Promise.promisify(myAsycn1); 那么我的function就是这样工作的 myAsync1('{..}', 'http://..').then(function(){…}); 这一直困扰着我。 有没有一种模式,asynchronous非诺言库或function需要遵循蓝鸟promisifyAll将其转换为基于承诺的方法或有一些魔法,将其转换。 如果不是那么什么要求,它是如何与现有的库,如mongodb等工作

蓝cor协同使用

我试图使用蓝鸟的协程如下: var p = require('bluebird'); //this should return a promise resolved to value 'v' var d = p.coroutine(function*(v) { yield p.resolve(v); }); //however this prints 'undefined' d(1).then(function(v){ console.log(v); }); 这里有什么不正确的?