承诺nodejs可读性改进

Elv*_*ra 2 javascript node.js promise

我写了一些返回承诺的函数,从google analytics api获取数据.我想我写的东西叫做回调地狱..

有人可以帮我优化这些代码(或提供提示/最佳实践),因此它更具可读性.

var express = require('express');
var router = express.Router();
var googleAuth = require('google-oauth-jwt');
var google = require('googleapis');
var app = express();

module.exports.getGoogleData = function (jwtClient,analytics,VIEW_ID){
  return new Promise(function(resolve, reject){
    return getOrdersToday(jwtClient,analytics,VIEW_ID).then(function (orders) {
      return getOnlineUsersToday(jwtClient,analytics,VIEW_ID).then(function (users) {
        return getSearchedToday(jwtClient, analytics, VIEW_ID).then(function (searched){
          return getPageviewsTodayAndUsersToday(jwtClient, analytics, VIEW_ID).then(function (pageviews){
            var returndata =[
              {
                "Orders":orders,
                "Onlineusers":users,
                "searched":searched,
                "pageviews":pageviews[0].pageviews,
                "usersToday":pageviews[0].users
              }
            ]
            resolve(returndata);
          });
        });
      });
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

示例getfunction

function getOrdersToday(jwtClient,analytics,view_id){
  return new Promise(function(resolve,reject){
    analytics.data.ga.get({
        'auth':jwtClient,
        'ids': view_id,
        'metrics': 'ga:totalEvents',
        'start-date': 'today',
        'end-date': 'today',
        filters: 'ga:eventAction==Bestelling geplaatst',
        'max-results': '1'
    }, function(err, response) {
          // handle the errors (if any)
          if(err){
            console.log(err)
            reject(err)
          } else
            console.log('Response:',response)
            resolve(response.totalsForAllResults["ga:totalEvents"]);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

根本没有必要new Promise在那里,事实上,通过使用它,你可以保持开放,如果你的一个电话中发生错误,永远不会解决.请记住,then返回一个新的承诺.因此,如果您希望它们按顺序运行,您可以将所有这些链接在一起:

module.exports.getGoogleData = function (jwtClient,analytics,VIEW_ID){
  var result = {};
  return getOrdersToday(jwtClient,analytics,VIEW_ID)
    .then(function (orders) {
        result.Orders = orders;
        return getOnlineUsersToday(jwtClient,analytics,VIEW_ID);
    })
    .then(function (users) {
      result.Onlineusers = users;
      return getSearchedToday(jwtClient, analytics, VIEW_ID);
    }).then(function (searched){
      result.searched = searched;
      return getPageviewsTodayAndUsersToday(jwtClient, analytics, VIEW_ID);
    }).then(function (pageviews){
      result.pageviews = pageviews[0].pageviews;
      result.usersToday = pageviews[0].users;
      return [result]; // (Seems a bit odd that it's wrapped in an array, but
                       // that's what the original code did...)
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,这些操作看起来彼此独立.如果确实如此,请与Promise.all以下内容并行运行:

module.exports.getGoogleData = function (jwtClient,analytics,VIEW_ID){
  return Promise.all([
    getOrdersToday(jwtClient,analytics,VIEW_ID),
    getOnlineUsersToday(jwtClient,analytics,VIEW_ID),
    getSearchedToday(jwtClient, analytics, VIEW_ID),
    getPageviewsTodayAndUsersToday(jwtClient, analytics, VIEW_ID)
  ]).then(results => {
    return [{
      Orders: results[0],
      Onlineusers: results[1],
      searched: results[2],
      pageviews: results[3][0].pageviews,
      usersToday: results[3][0].users
    }];
  });
}
Run Code Online (Sandbox Code Playgroud)