gpt4 book ai didi

javascript - 简化 Promise 链

转载 作者:行者123 更新时间:2023-11-28 18:31:35 25 4
gpt4 key购买 nike

我试图通过让函数处理函数数组来尽可能简化 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.");
});

最佳答案

你的错误出现在Chain函数中:

chain.forEach(function(i){  i = function(r){return new Promise(i)};   });
chain.reduce(function(cur, next) { {cur.then(next)} }, Promise.resolve()).then(function() { cb() });

具体来说,在 forEach 中分配给 i 绝对不会执行任何操作。你真正想要的是使用map:

chain.map(function(exec){ return function(r){ return new Promise(exec)}; }).reduce(…);

其中 map 返回一个函数数组,然后您可以对其进行缩减。

<小时/>

无论如何,你真正应该做的是promisify UserData 函数:

function user(name, options) {
return new Promise((resolve, reject) => {
if (options)
UserData(name, options, resolve);
else
UserData(name, resolve);
});
}

您甚至不需要链,只需编写即可

user('elle').then(i => { 
console.log(i);
return user('tyler', {age:"22"});
}).then(i => {
console.log(i);
return user('nerd');
}).then(i => {
console.log(i);
return user('jeax');
}).then(i => {
console.log(i);
}).then(function() {
//all executed
console.log("Done.");
});

如果您有动态大小的用户名数组,您仍然可以使用 reduce,但不应使用函数数组。

关于javascript - 简化 Promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37882327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com