Javascript 使用Reduce在数组中的每个项上运行函数,并带有延迟

Javascript 使用Reduce在数组中的每个项上运行函数,并带有延迟,javascript,promise,settimeout,reduce,Javascript,Promise,Settimeout,Reduce,我正在构建一个脚本,从API检索数据以构建自己的数据库。我的费率仅限于每小时相对较低的通话次数 我必须对不同的数据库进行多次连续调用,以收集所需的数据,这必须按顺序进行,因为在收到第一个数据库的值之前,我不知道从下一个数据库调用什么 我需要为数组中的每个项运行这些顺序抓取,我需要为这些项收集额外的数据 我把这个脚本作为一个样板来写,但我觉得它并不像它应该的那样简单,或者说是最佳实践,我正在寻求批评 setTimeout是用来减慢回迁速度的,这样我就不会超过速率限制而被阻塞。在reduce函数中使

我正在构建一个脚本,从API检索数据以构建自己的数据库。我的费率仅限于每小时相对较低的通话次数

我必须对不同的数据库进行多次连续调用,以收集所需的数据,这必须按顺序进行,因为在收到第一个数据库的值之前,我不知道从下一个数据库调用什么

我需要为数组中的每个项运行这些顺序抓取,我需要为这些项收集额外的数据

我把这个脚本作为一个样板来写,但我觉得它并不像它应该的那样简单,或者说是最佳实践,我正在寻求批评

setTimeout是用来减慢回迁速度的,这样我就不会超过速率限制而被阻塞。在reduce函数中使用链式承诺似乎是最好的方法。。。但这正是我不确定的。有没有更简单的方法来实现这一点

let myArray=[“豆”、“汤”、“花生”、“朝鲜蓟”];
myArray.reduce((承诺,项目)=>{
回报承诺。然后(()=>{
退货项目推荐(项目);
});
},Promise.resolve())。然后(()=>{
控制台日志(“全部完成”);
})
let itemsPromise=(项目)=>{
控制台日志(“项:”,项);
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
解决();
}, 2000);
});

}
我几乎喜欢
.reduce()
的承诺排序模式,但我也觉得最初的虚拟承诺有点毛茸茸的。所以,通过使用spread和rest操作符,您可以用Haskell式的递归方式做一些事情,如下所示:

var myArray=[“豆”、“汤”、“花生”、“朝鲜蓟”],
doSomething=console.log,
seqItems=(i,…is)=>is.length?项目承诺(i)。然后(v=>(doSomething(v),seqItems(…is)))
:项目承诺(i)。然后(做某事),
itemPromise=item=>new Promise((解析,拒绝)=>setTimeout(解析,2000,item));
seqItems(…myArray)
.reduce()
与承诺一起使用是一种设计模式,用于序列化异步调用,并围绕
setTimeout()
包装承诺,这是在承诺链中插入延迟的方式。Bluebird promise库内置了排序操作和延迟操作,如果您想使用一些预构建的工具而不是此工具,那么您所拥有的工具没有任何问题。此答案中带有延迟的
.reduce()
示例:。也可以对循环和异步等待使用