Я стараюсь как можно больше упростить цепочки Promise, имея функцию дескриптор массива функций. Они должны быть в порядке, но мой метод дать им правильный синтаксис не работает, и я уверен, что есть лучший способ сделать это. Каждая функция в цепочке вызывает базу данных и должна запускать следующую функцию при ее возврате.Упрощение цепочки обещаний
// Run each in order.
var Chain = function(chain, cb){
chain.forEach(function(i){ i = function(r){return new Promise(i)}; });
chain.reduce(function(cur, next) { {cur.then(next)} }, Promise.resolve()).then(function() { cb() });
}
Chain([
r=>{
UserData('elle', i=>{
console.log(i);
r(i)
})
},
r=>{
UserData('tyler', {age:"22"}, i=>{
console.log(i);
r(i);
})
},
r=>{
UserData('nerd', i=>{
console.log(i);
r(i)
})
},
r=>{
UserData('jeax', i=>{
console.log(i);
r(i)
})
}
], function(){
console.log("Done.");
});
В приведенном ниже примере работает, как мне это нужно, просто не используя функцию цепи, что я хочу с простотой каждого пункта.
var PChain = function(cb){
// Convert each item.
return function(){ return new Promise(r=>{cb(r)}) };
}
// The items.
var chain = [
PChain(r=>{
UserData('elle', i=>{
console.log(i);r(i)
})
}),
PChain(r=>{
UserData('tyler', {age:"22"}, i=>{
console.log(i);r(i);
})
}),
PChain(r=>{
UserData('nerd',
i=>{ console.log(i);r(i)
})
}),
PChain(r=>{
UserData('jeax',
i=>{ console.log(i);r(i)
})
})
];
chain.reduce(function(cur, next) { return cur.then(next) }, Promise.resolve()).then(function() {
//all executed
console.log("Done.");
});
'UserData' кажется странным: он не возвращает обещаний и не придерживается обычного соглашения об обратном вызове аргументов' (err, result) '. – robertklep
Хотя я получаю много насмешек за это, я использую e в качестве второго аргумента. В этом случае я не использовал его, потому что я просто проверяю вещи. UserData использует MongoDB для возврата информации профиля. –
Из приведенного выше кода неясно, почему его нельзя обрабатывать параллельно, но давайте предположим, что это не должно быть. Я считаю, что Bluebird может предложить что-то, что вам нужно, ['mapSeries'] (http://bluebirdjs.com/docs/api/promise.mapseries.html) последовательно обрабатывает массив обещаний. Вышеприведенный код излишне усложнен, я не могу предложить, как это применимо здесь. – estus