作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数,它使 1 个 API 调用返回一个 Promise。转换此代码以对不同时间戳进行 n 次调用的最佳方法是什么?我想返回一个对象,其中包含按关键时间戳存储的未聚合数据。
此代码在 i = 1 时运行,并且 histData 未定义。
const getEthPriceHistorical= (toSymbol) => {
var histData = {};
var ts;
for (let i = 1; i < 5; i++){
ts = new Date(new Date().getTime() - (24*i * 60 * 60 * 1000));
if (typeof toSymbol === 'string') {
toSymbol = toSymbol.toUpperCase();
} else {
toSymbol = 'USD,EUR,GBP,CHF,THB,AUD,INR';
}
***** WHAT TO DO WITH THIS SINGLE PROMISE *****
return popsicle.request({
method: 'POST',
url: 'https://min-api.cryptocompare.com/data/pricehistorical',
query: {
fsym: 'ETH',
tsyms: toSymbol,
timestamp: ts
}
})
.use(popsicle.plugins.parse(['json']))
.then(resp => resp.body)
.then(data => {
const symbols = Object.keys(data);
histData.ts = data;
console.log(ts, data);
});
}
return histData;
}
最佳答案
您的代码存在的问题是:
histData.ts = data
行将在每次迭代中更改 ts
属性(如果有多个迭代) - 应为 histData[ts] =数据
。一旦您考虑到代码中的错误,希望下面的代码是不言自明的
注意:Array.from({length: 4})
创建一个数组,索引 0...3 中有四个未定义的条目 - 因此时间戳使用 (i+1)
const getEthPriceHistorical= (toSymbol) => {
if (typeof toSymbol === 'string') {
toSymbol = toSymbol.toUpperCase();
} else {
toSymbol = 'USD,EUR,GBP,CHF,THB,AUD,INR';
}
return Promise.all(Array.from({length:4}).map((unused, i) => {
let ts = new Date(new Date().getTime() - (24*(i+1) * 60 * 60 * 1000));
return popsicle.request({
method: 'POST',
url: 'https://min-api.cryptocompare.com/data/pricehistorical',
query: {
fsym: 'ETH',
tsyms: toSymbol,
timestamp: ts
}
})
.use(popsicle.plugins.parse(['json']))
.then(resp => resp.body)
.then(data => {
const symbols = Object.keys(data);
return {ts, data};
});
})).then(results => results.reduce((result, {ts, data}) => {
result[ts] = data;
return result;
}, {}));
}
或者,最后 8 行左右可以是
.then(data => {
const symbols = Object.keys(data);
return {[ts]: data};
});
}))
.then(results => results.reduce((result, item) => Object.assign(result, item), {}));
}
注意:无论哪种方式,除了不执行任何操作的冗余代码之外,constsymbols = Object.keys(data);
是什么?
关于javascript - Node.js 使用冰棒 promise 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44490119/
我是一名优秀的程序员,十分优秀!