bluebird 是否具有用于在 promises 中包装函数的说服函数?
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
一样原生存在于 bluebird 中,但对于看似同步的函数(无回调),或者其他人是否发现它有用。
所以看起来 promisify 是这样做的,只是不像我想要的那样使用嵌套函数。
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)
})
我创建了一个带有 deep
可选参数的 Promise.methodAll
。使用@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]
})
是的,您可以为此使用 Promise.method
:
var helloWorld = Promise.method(function helloWorld(string) {
if(string == "foo") throw new Error("string is foo")
return aPromise(string)
});
您应该只对具有异步回调的函数使用 promisification,它不适用于同步或返回 promise 的函数(即使它确实捕获同步异常)。
我有一个函数对象。这些功能并不总是完全承诺。
例如:
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
一样原生存在于 bluebird 中,但对于看似同步的函数(无回调),或者其他人是否发现它有用。
所以看起来 promisify 是这样做的,只是不像我想要的那样使用嵌套函数。
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)
})
我创建了一个带有 deep
可选参数的 Promise.methodAll
。使用@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]
})
是的,您可以为此使用 Promise.method
:
var helloWorld = Promise.method(function helloWorld(string) {
if(string == "foo") throw new Error("string is foo")
return aPromise(string)
});
您应该只对具有异步回调的函数使用 promisification,它不适用于同步或返回 promise 的函数(即使它确实捕获同步异常)。