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

标签 javascript node.js promise

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

相关文章:

javascript - 如何使用 Javascript 将文件的各个部分并行上传到 Dropbox

javascript - 如何捕获信息框关闭事件(Google Maps API V3)

javascript - 为什么 HTTPs Node 库中的回调被调用两次?如何预防呢?

javascript - 等待 bluebird Promise 内的可选流程操作

javascript - 使用公共(public) JSON API 并将其显示为 html

javascript - 如何使用javascript递归替换单个正则表达式中文本字符串中的重复逗号

node.js - 无法在本地主机上获取图像

javascript - vuejs npm 开发服务器不显示更新的输出

javascript - Bluebird 创建新用户

angularjs - Ionic 3 - 异步 Http 调用和 Ionic 加载问题