我正在构建一个脚本,该API从API检索数据以构建我自己的数据库。我的速率限制为每小时呼叫数量相对较少。
我必须对不同的数据库进行几次顺序调用以收集我需要的数据,这必须按顺序完成,因为我不知道从下一个数据库调用什么,直到我从第一个数据库收到值数据库中。
我需要为数组中的每个项运行这些顺序提取,我需要为其收集其他数据。
我已经把这个剧本写成了样板,但我觉得它不是那么简单,也不是最佳实践,而是我在寻找批评。
setTimeout用于减慢提取速度,因此我不会超过速率限制并被阻止。在减少函数中使用链式承诺似乎是最好的方式......但这是我不确定的。有没有更简单的方法来实现这一目标?
let myArray = ["beans", "soup", "peanuts", "artichokes"];
myArray.reduce((promise, item) => {
return promise.then(() => {
return itemsPromise(item);
});
}, Promise.resolve()).then(() => {
console.log("ALL DONE");
})
let itemsPromise = (item) => {
console.log("Item: ", item);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 2000);
});
}

此脚本成功将项目记录到控制台,预期延迟2秒。在现实生活中,我将运行api调用而不是登录到控制台。
答案 0 :(得分:0)
我几乎喜欢.reduce()
的承诺排序模式,但我也觉得最初的假承诺有点毛茸茸。因此,通过将spread和rest操作符放在工作中,您可以使用Haskellesque递归方式执行以下操作:
var myArray = ["beans", "soup", "peanuts", "artichokes"],
doSomething = console.log,
seqItems = (i,...is) => is.length ? itemPromise(i).then(v => (doSomething(v), seqItems(...is)))
: itemPromise(i).then(doSomething),
itemPromise = item => new Promise((resolve, reject) => setTimeout(resolve, 2000, item));
seqItems(...myArray);