等待多个(异步)API调用完成

时间:2017-11-29 04:29:23

标签: javascript node.js asynchronous promise

非常一个nodejs noob,试图理解承诺,等待,异步。我保证你做了我的尽职调查研究(花了一整天的时间研究以获得下面的代码。我仍然不完全确定一切都是应该的,并且找不到具有完全相同的参考(或关闭)我想在这里做的事情。

感谢您的帮助。

一般结构:

函数 msg()正在等待4个函数完成,4个api调用(代码只显示一个):函数 redditPromise ()。

redditPromise ()调用异步函数 redditGet () - >那个将调用reddit API的人,同时将API数据保存到数据库中。 (功能 saveToDb ())

var nodeSocialApi = require('node-social-api');
var Socstat = require('../proxy').Socstat;

exports.index = function (req, res, next) {

/* SAVES DATA TO MONGODB */
function saveToDb(website,total) {
     //** Start : NewAndSave
     Socstat.newAndSave(website, total, "random", function (err, socstat) { // newAndSave -> proxy/socstat.js
          if (err) {
               return next(err);
          }
     });
     //** End : NewAndSave
}
/* END SAVES DATA TO MONGODB */

/* GET DATA FROM REDDIT API */
const reddit = new nodeSocialApi.Reddit(); // no auth needed

async function redditGet() {
   let result;

   await reddit.get('r/about/about.json')
   .then((data) => {

   // callback value for promise
   result = data.data.subscribers;
   saveToDb("reddit",result);

   }) // end then
   .catch(err => console.log(err));

   return result;
}
/* END : GET DATA FROM REDDIT API */

/* REDDIT PROMISE (all the others look the same) */
function redditPromise() {
     return new Promise(resolve => {
         resolve(redditGet());
     });
}
/* END : REDDIT PROMISE (all the others look the same) */

/* ONE FUNCTION THAT WAITS FOR ALL PROMISED FUNCTIONS */
async function msg() {
  const [a, b, c,d] = await Promise.all([githubPromise(), twitterPromise(), redditPromise(), facebookPromise()]);

  console.log(a + " " + b + " " + c  + d);
}
/* END: ONE FUNCTION THAT WAITS FOR ALL PROMISED FUNCTIONS */

msg();

}; // END exports

1 个答案:

答案 0 :(得分:0)

希望我做得对,把它写成一个新的答案"。基本上只是想表明我没有把这里的帮助视为理所当然。一直在努力支付我的会费。

基于评论(@HMR),我尝试将一些函数转换为async / await。 我想我不确定两件事: 1)是我的最终返回response.fan_count等待saveToDb完成?我尝试将return response.fan_count放在saveToDb.then承诺中,但这不起作用。 2)我应该将saveToDb.then()结构转换为async / await吗?

const facebookGet = async () => {  

facebookGet ()  {
    //just return a promise:
    let response; // outside to be able to return in the end
    try {
         response = await facebook.get('1118720888180564/fields=fan_count');
         console.log(response.fan_count);
         saveToDb("facebook",response.fan_count)
         .then(dbResult => {
              console.log("db entry succesfull -> " + dbResult); // returns the database object
         })
         .catch(err => console.error(err));
    }
    catch (err) {
         console.log("fetch failed ", err);
    }
return response.fan_count;
}

回答我自己的问题1)

投入"返回"之前" saveToDb" ...允许我写"返回response.fan_count"在" .then"