繁体   English   中英

如何使用Node.js进行多个API调用以将所有结果保存在一个json文件中?

[英]How can I make multiple API calls to save all results in one json file using Nodejs?

我想一次性从JSON API中获取针对不同url(值)的结果,并将结果保存在一个json文件中。 我的方法是以下方法,但是我在生成的对象和json文件中陷入了待处理的Promises。 有什么办法可以使用Promises解决此问题,还是应该使用回调? 任何提示,不胜感激。 我相信可以更好地编码。

const fetch = require('node-fetch');
const util = require('util');

function getIndicator (indicator) {
  url = 'http://api.worldbank.org/countries/de/indicators/' + indicator + '/?date=2012:2018&format=json';
  let result = fetch(url)
    .then(function(res) {
      return res.json();
    })
    .then(function(json) {
      return json;
    })
  return result;
}

function loadIndicators () {
  let indicators = ['SP.POP.TOTL','SP.DYN.IMRT.IN','SP.DYN.LE00.IN'];
  let german_indicators = {};
  indicators.forEach(function (e) {
    german_indicators[e] = getIndicator(e);
  })
  return german_indicators;
}

let result = loadIndicators();
fs.writeFileSync('./data.json', util.inspect(result), 'utf-8');

您的getIndicatorloadIndicators函数可以返回Promise因此您可以在loadIndicators循环中执行Promise.all

const fetch = require('node-fetch');
const util = require('util');
function getIndicator(indicator) {
    const url = 'http://api.worldbank.org/countries/de/indicators/' + indicator + '/?date=2012:2018&format=json';
    return fetch(url)
        .then(function (res) {
            return res.json();
        });
}
function loadIndicators() {
    return new Promise((resolve, reject) => {
        const promises = [];
        let indicators = [
            'SP.POP.TOTL',
            'SP.DYN.IMRT.IN',
            'SP.DYN.LE00.IN'
        ];
        let german_indicators = {};
        indicators.forEach(function (e) {
            promises.push(new Promise((resolve, reject) => {
                getIndicator(e).then((result) => {
                    german_indicators[e] = result;
                    resolve();
                }).catch(reject);
            }));
        });
        Promise.all(promises).then(() => {
            resolve(german_indicators);
        }).catch(reject);
    });
}
loadIndicators().then((result) => {
    fs.writeFileSync('./data.json', util.inspect(result), 'utf-8');
}).catch(console.error);

您可以等待所有promise都被解析,每个解析都会将JSON添加到全局变量或文件中。 使用promise库时,这可能很棘手。

我建议使用蓝鸟或任何其他替代品。 专门针对您的问题,查看bluebird的promise.all API。

它认为它将更简单

var request = require('request');
var util = require('util');
var Q = require('q');
var fs = require('fs');

function loadIndicators() {
        var deferred = Q.defer();

        let indicators = [
            'SP.POP.TOTL',
            'SP.DYN.IMRT.IN',
            'SP.DYN.LE00.IN'
        ];
        let german_indicators = {};
        var promises = indicators.map((e)=>{
          var url = 'http://api.worldbank.org/countries/de/indicators/' + e + '/?date=2012:2018&format=json';

         request.get(url,function(err,res,body){

                 if(err){

                    deferred.reject(err)
                    }else{

                     deferred.resolve(body)
                      }

                 })

              return deferred.promise;            

        })


       Q.allSettled(promises).then((data)=>{
         var final_obj = {};
          for(var i = 0;i<data.length;i++){

              if(data[i].state == 'fulfilled'){

                  final_obj['val_'+i] = data[i].value; 

             }

          }
         writeFile(final_obj);


       })

}

loadIndicators()

 function writeFile(val){

   fs.writeFileSync('./data.json', util.inspect(val), 'utf-8');

  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM