使用Reduce在数组中的每个项目上运行函数,具有延迟

时间:2018-03-17 18:41:57

标签: javascript promise settimeout reduce

我正在构建一个脚本,该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调用而不是登录到控制台。

1 个答案:

答案 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);