У меня есть объект функций. Эти функции не всегда полностью обещаны.
Например:
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)
})
}
}
})
}
Мне было интересно, существовало ли это уже изначально в bluebird, например promisifyAll
, но для внешне синхронных функций (без обратных вызовов), или другие сочли это полезным.
Так что кажется, что обещание делает это, просто не с вложенными функциями, как хотелось бы.
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)
})
return Promise.resolve().then(function(){ …; return …; })
илиreturn new Promise(function(resolve) { … resolve(…); })
? - person Bergi   schedule 15.07.2015