gpt4 book ai didi

javascript - Node.js 使用冰棒 promise 异步

转载 作者:行者123 更新时间:2023-12-01 03:32:06 24 4
gpt4 key购买 nike

我有一个函数,它使 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;
}

最佳答案

您的代码存在的问题是:

  1. 循环中的返回,从函数返回 - 这就是循环只运行一次的原因
  2. histData 是该函数的本地变量,异步填充。在该函数外部不可见,并且我无法在该函数内部看到您甚至确定它是未定义的
  3. 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com