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