Questions tagged «bluebird»

蓝鸟是针对客户端和服务器JavaScript的功能齐全的Promise库,侧重于创新功能和性能。

19
如何将现有的回调API转换为Promise?
我想使用Promise,但我有以下格式的回调API: 1. DOM加载或其他一次事件: window.onload; // set to callback ... window.onload = function() { }; 2.普通回调: function request(onChangeHandler) { ... } request(function() { // change happened ... }); 3.节点样式回调(“ nodeback”): function getStuff(dat, callback) { ... } getStuff("dataParam", function(err, data) { ... }) 4.带有节点样式回调的整个库: API; API.one(function(err, data) { API.two(function(err, data2) { API.three(function(err, …

17
如何访问.then()链中的先前的诺言结果?
我已经将我的代码重组为promises,并构建了一个美好的长而平坦的promise链,其中包括多个.then()回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上一个回调的范围内,如何访问它们? function getExample() { return promiseA(…).then(function(resultA) { // Some processing return promiseB(…); }).then(function(resultB) { // More processing return // How do I gain access to resultA here? }); }

2
什么是显式的Promise构建反模式,如何避免呢?
我正在编写代码,执行以下操作: function getStuffDone(param) { | function getStuffDone(param) { var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) { // or = new $.Deferred() etc. | // using a promise constructor myPromiseFn(param+1) | myPromiseFn(param+1) .then(function(val) { /* or .done */ | .then(function(val) { d.resolve(val); | resolve(val); }).catch(function(err) …

10
不只承诺回调吗?
我已经开发JavaScript几年了,我完全不了解关于promise的麻烦。 看来我所做的就是改变: api(function(result){ api2(function(result2){ api3(function(result3){ // do work }); }); }); 无论如何我都可以使用像async这样的库,它有类似以下内容: api().then(function(result){ api2().then(function(result2){ api3().then(function(result3){ // do work }); }); }); 这是更多的代码和更少的可读性。我在这里什么都没得到,也不是突然变得神奇地“平坦”。更不用说必须将事情变成诺言。 那么,这里的诺言有什么大惊小怪的呢?


1
现在我们有了ES6承诺,还有理由使用Q或BlueBird这样的承诺库吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 改善这个问题 在Node.js添加对Promise的本机支持之后,还有理由使用Q或BlueBird之类的库吗? 例如,如果您正在启动一个新项目,并假设在该项目中您没有使用这些库的任何依赖项,那么我们是否可以说没有更多理由使用这些库了?

7
.then(成功,失败)什么时候被视为承诺的反模式?
我看了蓝鸟诺言常见问题解答,其中提到这.then(success, fail)是一种反模式。我对试捕一无所知。以下是什么问题? some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) }) 该示例似乎建议以下是正确的方法。 some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) }) 有什么不同?

1
Bluebird的util.toFastProperties函数如何使对象的属性“快速”?
在Bluebird的util.js文件中,它具有以下功能: function toFastProperties(obj) { /*jshint -W027*/ function f() {} f.prototype = obj; ASSERT("%HasFastProperties", true, obj); return f; eval(obj); } 由于某种原因,在return函数之后有一条语句,我不确定为什么会在其中。 同样,这似乎是故意的,因为作者已对此发出了JSHint警告: “返回”后无法到达“评估”。(W027) 此功能的作用是什么?难道util.toFastProperties真的让一个对象的属性“快”? 我已经在Bluebird的GitHub存储库中搜索了源代码中的任何注释或问题列表中的解释,但找不到任何注释。

7
处理承诺链中的多个渔获
我对诺言仍然还很陌生,目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,举例来说,我在Express应用程序中有一个Promise链,如下所示: repository.Query(getAccountByIdQuery) .catch(function(error){ res.status(404).send({ error: "No account found with this Id" }); }) .then(convertDocumentToModel) .then(verifyOldPassword) .catch(function(error) { res.status(406).send({ OldPassword: error }); }) .then(changePassword) .then(function(){ res.status(200).send(); }) .catch(function(error){ console.log(error); res.status(500).send({ error: "Unable to change password" }); }); 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸毁并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果还有其他问题,请返回500 因此,当前的捕获量似乎并没有停止链接,这是有道理的,所以我想知道是否存在一种方法可以根据错误以某种方式强制链停止在某个点,或者是否有更好的方法构造这种形式以获得某种形式的分支行为,例如if X do Y …

13
正确编写承诺循环的方式。
如何正确构造一个循环,以确保以下的promise调用和链接的logger.log(res)通过迭代同步运行?(蓝鸟) db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise 我尝试了以下方法(来自http://blog.victorquinn.com/javascript-promise-while-loop的方法) var Promise = require('bluebird'); var promiseWhile = function(condition, action) { var resolver = Promise.defer(); var loop = function() { if (!condition()) return resolver.resolve(); return Promise.cast(action()) .then(loop) .catch(resolver.reject); }; process.nextTick(loop); return resolver.promise; }); var count = 0; promiseWhile(function() { return …

2
在此之前和之后放置渔获物
我很难理解将.catchBEFORE和AFTER放在嵌套诺言中的区别。 选择1: test1Async(10).then((res) => { return test2Async(22) .then((res) => { return test3Async(100); }).catch((err) => { throw "ERROR AFTER THEN"; }); }).then((res) => { console.log(res); }).catch((err) => { console.log(err); }); 选择2: test1Async(10).then((res) => { return test2Async(22) .catch((err) => { throw "ERROR BEFORE THEN"; }) .then((res) => { return test3Async(100); }); }).then((res) …

8
用Node.js中的promise替换回调
我有一个简单的节点模块,该模块连接到数据库,并具有几个接收数据的功能,例如此功能: dbConnection.js: import mysql from 'mysql'; const connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'db' }); export default { getUsers(callback) { connection.connect(() => { connection.query('SELECT * FROM Users', (err, result) => { if (!err){ callback(result); } }); }); } }; 该模块将从另一个节点模块中以这种方式调用: app.js: import dbCon from './dbConnection.js'; dbCon.getUsers(console.log); …

2
Promise.resolve与新Promise(resolve)
我使用的是bluebird,我看到了两种将同步功能解析为Promise的方法,但是我没有得到两种方法之间的区别。看起来stacktrace有点不同,所以它们不只是一个alias,对吗? 那么首选的方法是什么? 方式A function someFunction(someObject) { return new Promise(function(resolve) { someObject.resolved = true; resolve(someObject); }); } 方式B function someFunction(someObject) { someObject.resolved = true; return Promise.resolve(someObject); }

7
如何使用Bluebird来实现Node的child_process.exec和child_process.execFile函数的功能?
我正在Node.js下使用Bluebird Promise库,太好了!但是我有一个问题: 如果查看一下Node的child_process.exec和child_process.execFile的文档,您会发现这两个函数都返回一个ChildProcess对象。 那么推荐这种功能的推荐方法是什么? 请注意以下工作(我得到一个Promise对象): var Promise = require('bluebird'); var execAsync = Promise.promisify(require('child_process').exec); var execFileAsync = Promise.promisify(require('child_process').execFile); 但是如何获得原始Node.js函数的原始返回值?(在这些情况下,我将需要能够访问最初返回的ChildProcess对象。) 任何建议,将不胜感激! 编辑: 这是使用child_process.exec函数的返回值的示例代码: var exec = require('child_process').exec; var child = exec('node ./commands/server.js'); child.stdout.on('data', function(data) { console.log('stdout: ' + data); }); child.stderr.on('data', function(data) { console.log('stderr: ' + data); }); child.on('close', function(code) { console.log('closing …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.