- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我有一种方法,使用 bluebird 提供的 Promise 类根据第三方函数的结果来解析或拒绝。我担心的是第三方函数是同步的,因此可能会引发错误。下面是我的代码:
Authenticator.prototype.createJWTResponse = function(user, secret) {
if (user && user.ID) {
var expires = moment().add(7, 'days').valueOf();
//encode is third party and synchronous that can throw error
var token = jwt.encode({
iss: user.ID,
exp: expires
}, secret);
//throw new Error("thrown by a promise method");
return Promise.resolve({
token: token,
expires: expires,
user: {}
});
} else {
return Promise.reject(new Error('Authenticator:createJWTResponse: user object missing or doesnt have ID'));
}
};
一种选择是我不在方法中使用拒绝和响应,并将其设为普通回调方法,然后由 Promise.promisify 进行 promise 。然而我的问题是;如果有办法使用resolve和reject并创建一个promise,以防第三方方法抛出异常。我的另一个问题是; bluebird 文档中没有说明;如果在方法中使用resolve和reject;可以 promise 这样的方法吗?我试图 promise 上述方法,但由于某种原因它无法返回并且不会抛出错误;这让我怀疑,如果在方法中使用resolve、reject,那么就不能 promise 这样的方法。
有人可以帮我澄清一下吗?提前致谢。
(更新)
如果我将方法包装在 Promise.method 中; bluebird 抛出一个非常明显的错误,如下所示:
可能未处理的错误:否则 promise 返回方法中的同步错误
从此方法内部返回 Promise.try 也会引发与 Promise.method 相同的错误。
将方法中的代码包装在 try catch 中并在错误时拒绝也会抛出:
可能未处理的错误:
(解决方案)
按照本杰明的建议;从方法中删除所有的resolve和reject调用并将其包装在Promise.method中给出了预期的结果。最终代码如下:
Authenticator.prototype.createJWTResponse = Promise.method(function(user, secret) {
if (user && user.ID) {
var expires = moment().add(7, 'days').valueOf();
var token = jwt.encode({
iss: user.ID,
exp: expires
}, secret);
//Note: This is caught by the catch block on this method
//throw new Error('sync error thrown');
return {
token: token,
expires: expires,
user: {}
}
} else {
throw new Error('Authenticator:createJWTResponse: user object missing or doesnt have id');
}
});
在这种情况下甚至不需要回调。
最佳答案
首先,.promisify 已经将抛出转换为拒绝。
对于正常的 promise - Promise 构造函数是抛出安全的,您可以使用抛出安全的 Promise.method
。
同步抛出转换为拒绝的原因是为了创建一致的 API,这样您就不必一直进行 .catch 和 catch。
关于javascript - 通过使用resolve或reject或Promisify(bluebird)进行 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343489/
我如何 promise 基于 websocket 事件的通信,使其像 ajax 一样工作? constructor(){ this.ws = new WebSocket(...); this.
我有一个返回 promise 的异步函数。在函数第一次完成时,我正在缓存响应。在后续调用中,如果缓存响应可用,我希望使用它。我如何构建实现此行为的 promise ? 这样的东西行得通吗? if(th
我正在关注 Stephen Grinder 教程,他开始使用 Promisify。 为此,他给出了非常模糊的解释,说 redis 需要一个回调函数,他发现 very untidy + redis 不支
最近我接受了 promise 链模式。这样做很方便: action1 .then(()=> action2()) .then(()=> action3()); 但是,为了做到这一点,我像这样更改了所有
我想在我的项目中使用 arangojs 3.4.2。从 3.0 开始,驱动程序不再使用任何 promise 。在尝试了几个库来 promise 驱动程序后,我没有成功(bluebird,promisi
我正在尝试使用 bluebird 来 promisify phantomJS 方法: page = require('webpage').create(); var checkWebpage = Pr
我很困惑为什么 Bluebird 的 Promise.promisify 没有 promise 我的查询函数,因为它像大多数节点样式函数一样需要回调。难道是 Mongoose 的 Aggregatio
我正在使用一个名为 arp-a 的 npm 包它返回网络地址列表。 从简短的文档来看,arp.table() 方法如下所示: arp.table(function(err, entry) { //
let nasPath = ""; return getFamInfo(args.familyID) .then(function (famInfo) { nasPath =
我编写了一些函数来接受两个回调和一些我想 Promisify 的参数。示例: function myFunction(successCallback, failureCallback, somePar
所以我有一个函数应该立即返回一个被拒绝或已解决的 Promise,即它基本上是一个我想“promisify”的同步函数。 在这种情况下我通常做的是这样的: func() { // some
我是这样写 JavaScript 的: var keys=null; var promise=Promise.promisify(alchemyapi.keywords("url",myUrl,{},
我正在做一个项目,我必须遍历几个 api,并在每个 api 上下载多个页面。我的代码使用回调工作,但我不确定如何在最后一个 http 请求完成后运行代码。 const RateLimiter = re
我如何promisify redis 以便我可以使用then? 我已尝试向客户 promise : var redis = require('redis'); Promise.promisifyAll
他们还有其他方式进行 promise 转换吗? var Promise = require("bluebird"); let findOneOrCreate = require('mongoose-f
我正在尝试使用 util.promisify功能,但我的代码不起作用。我想我不明白 promises/promisify 是如何工作的。如果我使用 new Promise 我的代码可以工作,但是如果我
在我 promise 我的 XMLHttpRequest 之后,像这样: var Request = (function() { var get = function(url){ return
我正在尝试在我的 React 应用程序中 promise zlib.gunzip: const zlib = require('zlib') const util = require('util')
我读过类似的帖子,但没有一个能很好地说明如何正确地做到这一点。 我理解 Promises 以及它们通常是如何创建的,成功和失败的监听器等待被触发以解决或拒绝。 我不明白的是,当我调用一个将成功和失败回
我的需求是这样的 我想运行一个 axios 调用。 我不想在代码完成之前阻止它。 我也不想知道是 200 还是 500 这是我的实验代码。 function axios() { console.l
我是一名优秀的程序员,十分优秀!