Node.js Promises - 在then()中访问范围变量

时间:2017-11-21 18:09:44

标签: javascript node.js scope promise

节点版本:8.1.3

嘿伙计们,

我会尽量使这个变得简单=)

我每天都有.xlsx报告,其中包含从API获取的统计信息。它运作顺利。但是,在某些时候我不得不从 Promise.all 转移到以序列方式解析Promise,因为在所有调用完成时,API抛出了相当多的“重负载”错误并行,我不想为此编写任何并发函数。

到目前为止一切顺利。

第一个问题 - >对于数据API的一部分,并不能完全归还我想要的内容。我需要汇总的统计信息,让我们调用 type day 。但是,API无法同时聚合,因此我必须继续循环并请求类型聚合。我需要的每一天。

第二个问题 - > API将不会在请求所在的那一天返回JSON,因此我已将其分配给then()语句中的对象

for (var date = moment(startDate); date.isBefore(yesterday); date.add(1, 'days')) {
    promiseStats.push((() => {
        var report = rep;
        var requestDate = date.format('YYYY-MM-DD');
        return getStats(adv.id, {
            dayFrom: date.format('YYYY-MM-DD'),
            dayTo: date.format('YYYY-MM-DD'),
            groupBy: 'campaign'
        }).then((res) => {
            _.each(res, (o) => {
                Object.assign(o, {
                    day: requestDate
                })
            });
            report.data.push(...res);
        }); // getCampaignStats()
    })); // end promiseStats.push
} // for date end

我创建了一个匿名函数来扩展变量的范围,并在解析Promise时能够访问它。当我使用 Promise.all 时,这很好用。但是,当我将代码更改为按顺序解析时,它当然会停止工作,因为代码只会在解析promise时运行该匿名函数,然后 date 不是同一个值。

这就是我现在解决承诺的方式:

promiseStats.reduce((p, fn, index) => {
    return p.then(val => {
        return fn();
    });
}, Promise.resolve()).then(() => { 
 //do stuff here
});

问题 有没有办法绕过这个并为对象分配正确的日期值?这已经成为我的绊脚石了好几天了。我想我可以通过回到旧代码并使用并发并平衡调用次数来解决这个问题,以避免API过载。

提前多多感谢!

0 个答案:

没有答案