bluebird有一个说服函数来把函数包装在承诺中吗?
Does bluebird have a convince function for wrapping functions in promises?
我有一个函数对象。这些函数并不总是完全承诺的。
例如:function helloWorld(string){
if(string == "foo") throw new Error("string is foo")
return aPromise(string)
}
如果string
是"foo",那么这将抛出一个错误,该错误不会被catch
调用捕获。
我宁愿写像上面这样干净的代码,而不是这样:
function helloWorld(string){
return Promise.resolve(){
if(string == "foo") throw new Error("string is foo")
return aPromise(string)
}
}
所以我创建了这些映射到对象上的函数,并添加了嵌套的Promise.resolve
。
makePromises: function(obj){
return _.mapObject(obj, function(fn){
return function(){
var args = _.values(arguments)
return Promise.resolve().then(function(){
return fn.apply(null, args)
})
}
})
},
makeNestedPromises:function(obj){
return _.mapObject(obj, function(fn){
return function(){
var args = _.values(arguments)
var value = fn.apply(null, args)
return function(){
var args = _.values(arguments)
return Promise.resolve().then(function(){
return value.apply(null, args)
})
}
}
})
}
我想知道这是否已经存在于蓝鸟像promisifyAll
,但似乎同步函数(没有回调),或者如果其他人发现这很有用。
所以promise似乎是这样做的,只是不像我想的那样使用嵌套函数。
var Promise = require("bluebird")
var concat = function(one, two){
return Promise.resolve(one + " " + two)
}
var fns = {}
fns.hello = function(name, rank){
if(name == "tom") throw new Error("tom unauthorized")
return concat(name, rank)
}
Promise.promisifyAll(fns)
fns.helloAsync("tom", "developer")
.catch(function(e){
console.log(e)
})
var Promise = require("bluebird")
var concat = function(one, two){
return Promise.resolve(one + " " + two)
}
var fns = {}
fns.hello = function(unauthorized){
return function(name, rank){
if(name == unauthorized) throw new Error("unauthorized")
return concat(name, rank)
}
}
Promise.promisifyAll(fns)
// here promisify thinks that the top level function should be a promise
fns.helloAsync("tom")("tom", "developer")
.catch(function(e){
console.log(e)
})
是的,您可以使用Promise.method
:
var helloWorld = Promise.method(function helloWorld(string) {
if(string == "foo") throw new Error("string is foo")
return aPromise(string)
});
你应该只对异步回调函数使用承诺,它不适用于同步或返回承诺的函数(尽管它可以捕获同步异常)。
我创建了一个Promise.methodAll
和一个deep
可选参数。使用@Bergi的答案中的Promise.method
var Promise = require("bluebird")
var _ = require("underscore")
Promise.methodAll = function(obj, deep){
return _.mapObject(obj, function(fn){
if(!deep) return Promise.method(fn)
return function(){
var nestedFn = fn.apply(null, _.values(arguments))
return Promise.method(nestedFn)
}
})
}
var concat = function(one, two){
return Promise.resolve(one + " " + two)
}
var deep = {}
deep.authorize = function(unauthorized){
return function(name, rank){
if(name == unauthorized) throw new Error("unauthorized")
return concat(name, rank)
}
}
deep = Promise.methodAll(deep, true)
var normal = {}
normal.authorize = function(name, rank){
if(name == "tom") throw new Error("tom unauthorized")
return concat(name, rank)
}
normal = Promise.methodAll(normal)
normal.authorize("tom", "developer")
.catch(function(e){
console.log(e) //[Error: tom unauthorized]
})
deep.authorize("tom")("tom", "developer")
.catch(function(e){
console.log(e) //[Error: unauthorized]
})
相关文章:
- 从函数返回角度承诺
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 两个函数之间的角度承诺
- 当链接javascript承诺时,如何处理then()函数中的条件
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- JQuery 承诺已经包含回调的函数
- 将同步函数包装到承诺中的最佳方法是什么?
- 在同一函数中解析承诺后返回承诺
- JavaScript中的延期/承诺概念是一个新的概念,还是函数式编程的传统部分
- “未捕获(在承诺中)”在获取“then”方法中调用拒绝函数时
- 使用 Promise 在另一个函数中调用带有 Bluebird 承诺库的函数
- 从承诺返回不返回函数会导致警告
- 尝试编写承诺时出错:承诺解析器对象不是函数
- 如何在恢复函数之前等待 JavaScript 承诺解析
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- javascript承诺在循环中或如何逐个调用函数
- 按照承诺,通过与chai的函数调用验证已解析承诺的内容
- ES6承诺:如何用参数链接函数
- OfflineAudioContext.startRendering()基于承诺的函数在safari中不起作用
- NodeJS 多函数承诺