【发布时间】:2016-10-19 08:04:36
【问题描述】:
我试图通过让函数处理一组函数来尽可能简化 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)参数的常规回调约定。 -
虽然我收到了很多嘲笑,但我还是使用 e 作为第二个参数。在这种情况下,我没有使用它,因为我只是在测试。 UserData 使用 MongoDB 返回配置文件信息。
-
从上面的代码中并不清楚为什么不应该并行处理它,但我们假设它确实不应该。我相信 Bluebird 可能会提供您需要的东西,
mapSeries处理一系列承诺数组。上面的代码不必要地复杂,我不能建议它在这里如何应用。