Tag: 蓝鸟

是否仍然有必要提供MongoDB驱动程序?

这个问题的答案仍然是相关的: 我怎样才能使用蓝鸟promisify MongoDB原生的Javascript驱动程序? 我不知道从什么时候这是更新,但2.0的MongoDB的JS驱动程序在选项对象promiseLibrary有一个属性: http : promiseLibrary 大多数方法/函数都会返回一个promise,比如Cursor.toArray() 。 但是,我找不到使用这个新选项的例子,但是使用这个方法并不简单: MongoClient.connect('mongodb://URL', { promiseLibrary: require('bluebird') }); 或者这个定义是错误的? – 在这种情况下,应该如何正确定义? 更新: 代码在io.js上运行,所以我可能甚至不需要指定一个promiseLibrary作为驱动程序将使用ES6承诺? 然而,据说蓝鸟的承诺是较慢的: 为什么本机ES6承诺比bluebird更慢,更占用内存? Update2:我已经添加了蓝鸟标签 – 也许蓝鸟工作的人可以提供更多的细节,如果promisifying真的比使用MongoDB自己的实现更好?

Promise连接添加新的函数调用链

我试图加载和parsing一个文件,但是在调用两个函数时遇到了一些麻烦,并且返回了这个promise的结果。 我正在使用蓝鸟承诺。 以下代码按预期工作: run = function (filePath) { return Promise.join( fs.readFileAsync(filePath, 'utf8') .then(parseFile.parse.bind(null, 'userKey')), users.getUsersAsync(usersObj) .then(users.modifyRec.bind(null, process.env.users)) ).then(function (args) { return runProc('run', args[0], args[1]); …. 我已经将parseFile.parse函数分为两个方法, parseFile.parse和parseFile.getProp 。 parseFile.getProp应该从parseFile.parse获取输出,并返回在方法分解之前返回的parseFile.parse 。 这是我尝试使用这两个函数: run = function (filePath) { return Promise.join( fs.readFileAsync(filePath, 'utf8') .then(parseFile.parse.bind(null, 'userKey')) .then(parseFile.getProp.bind(null,'key')), users.getUsersAsync(usersObj) .then(users.modifyRec.bind(null, process.env.users)) ).then(function (args) { return runProc('run', args[0], args[1]); …. 但它不工作。 […]

蓝鸟承诺链:与结果“抓”

为了使这个问题对尽可能多的人有用,除了我在下面使用Node + Express的Bluebird承诺库之外,我将排除我的具体实现细节。 所以,假设我有下面的链( P返回一个promise, res是Express HTTP响应对象): P().then(function(){ // do nothing if all went well (for now) // we only care if there is an error }).catch(function(error){ res.status(500).send("An error occurred"); }).then(function(){ return P(); }).then(function(pVal1){ return [pVal1, P()]; }) // TODO: catch an error from P() here and log pVal1 .spread(function(pVal1, pVal2){ if(pVal1 === pVal2) { […]

承诺正在等待

我在我的nodejs应用程序中有一个类,下面的代码: var mongoose = require('mongoose'); var Roles = mongoose.model('roles'); var Promise = require("bluebird"); module.exports = Role; var err = null; var id; function Role(name, companyId) { this.err = err; this.name = name; this.companyId = companyId; this.id = getId(name, companyId); } var getId = function (name, companyId) { return new Promise(function(resolve, reject) { Roles.findOne({companyId:companyId, name:name}, function(err,result) […]

使用蓝鸟与未定义的成功callback函数

我在memcached上使用蓝鸟库。 memcached.set('foo', 'bar', 10, function (err) { /* stuff */ }); 这个函数不会在第二个参数中调用成功callback,所以看起来像。然后(res)函数不会被调用。 Promise.promisifyAll(memcached); memcached.setAsync(hashedCacheKey, obj).then(function (res) { resolve(res); }).catch(function (err) { reject(err, null); }); 有没有办法处理未成功的事件?

蓝鸟PromisifyAll没有任何asynchronous后缀,即取代原来的function可能?

Bluebird有一个promisifyAll函数,它“通过遍历对象的属性来提升整个对象,并在对象及其原型链上创build每个函数的asynchronous等价物”。 它使用后缀Async创build函数。 是否有可能完全取代旧的function? 被replace的函数就像原来的函数一样工作,另外它们也返回一个Promise,所以我认为完全replace旧函数应该是安全的。 var object = {}; object.fn = function(arg, cb) { cb(null,1) }; Bluebird.promisifyAll(object); object.fn // do not want object.fnAsync // => should replace `object.fn` 有一个选项来指定一个自定义后缀选项,但不幸的是它不适用于空string Bluebird.promisifyAll(object, {suffix: ''}); RangeError: suffix must be a valid identifier

Promise履行处理程序undefined

非常基本的,似乎基于Promise的实现的实现不会返回我期望看到的值/数据。 这是我期待这个接口工作的方式: sdk.request(options) => Promise~Response → Object (JSON) 这里是我的模型中的代码: return sdk.request(options).then(function (value) { return value; }); 当我logging模型的返回时,我看到这个: { _bitField: 0, _fulfillmentHandler0: undefined, _rejectionHandler0: undefined, _progressHandler0: undefined, _promise0: undefined, _receiver0: undefined, _settledValue: undefined } 当我看到_fulfillmentHandler0: undefined ,似乎暗示没有履行处理程序: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then 但履行处理程序似乎是存在的: return sdk.request(options).then(function (value) { // fulfillment handler, right? return value; });

node.js链多重承诺(mongoose)

以下是我正在处理的典型承诺函数。 var _delete = function(t, id) { return Promise.cast(Event.find({where: {id: id}}, {transaction: t})) .then(function(d){ if (d) { // ——- (*) return Promise.cast(d.updateAttributes({status: -1}, {transaction: t})) .then(function(){ // do inventory stuff return Promise.cast(Inventory.update({}).exec()) .then(function(d){ // do something }) }).then(function(){ // do product stuff return Promise.cast(Product.update({}).exec()) .then(function(d){ // do something }) }) } else { return Promise.reject('this […]

如何使用promise在Javascript中发生exception后重试?

我正在使用蓝鸟承诺库。 我有一系列如下的promisified函数: receiveMessageAsync(params) .then(function(data)) { return [data, handleMessageAsync(request)]; }) .spread(function(data, response) { return [response, deleteMessageAsync(request)]; }) .spread(function(response, data) { return sendResponseAsync(response); }) .then(function(data) { return waitForMessage(data); }) .catch (function(err) { // handle error here }); 偶尔sendMessage将会失败,因为我们假设服务器不能响应。 我希望代码能够一直试图回应,直到成功。 你不能简单地把sendMessage包装到一个catch中,因为它实际上并没有抛出一个exception,我想,它调用了“错误”函数,在这个promisified代码中是底部的“catch”。 所以必须有一些方法来在“catch”部分“重试”发送消息。 问题是,即使我在“catch”的循环中重试,我仍然没有办法跳到promise链并执行剩下的promisified函数。 我如何处理这个? 编辑: 我重试了一个HTTPpost,结果如下所示: function retry(func) { return func() .spread(function(httpResponse) { if (httpResponse.statusCode != 200) { […]

nodeJS中的承诺/承诺/执行顺序中的callback是不正确的

当我链接多个承诺时,我希望每个承诺只有在前一个承诺结束后才能执行。 不知何故,这并没有发生。 我确信使用承诺错误,并会喜欢一些解释… 我有这个代码: var Promise = require('bluebird'); func('A') .then(() => {func('B')}) .then(() => {func('C')}) .then(() => {func('D')}) function func(arg) { return new Promise(function(resolve){ console.log('>> ' + arg); setTimeout(function(){ console.log(' << ' + arg); resolve(); }, 200) }) } 我期待得到这个输出: >> A << A >> B << B >> C << C >> D << […]