如何在异步编程/节点js中处理此场景

时间:2017-02-21 17:47:57

标签: javascript node.js async.js asynchronous-javascript node-deasync

我正在nodejs中编写服务。请阅读以下我正在采取的解决此问题的方法。

首先,我调用休息端点(说/ offer)来获取数据。说它是cloudSenseData

最终回复我需要按摩/操纵数据,以便将所需的响应作为输出返回。

在按摩数据(来自上面的呼叫)期间,我必须检查是否存在相关的产品信息。

如果存在,我需要调用另一个休息端点(例如/ offers /:id / products) :id是在之前的调用(cloudSenseData)中获得的catalogueitemid,以获取更多相关的产品信息详细信息,我可以将其包含在最终的按摩输出中。

所以我想在cloudSenseData中有10个catalogueItems。

这些是我在按摩数据时所做的步骤:

  1. 在cloudSenseData上使用async.map并将其映射到所需的响应格式。(我用它来完成并行操作)并使用回调函数来满足需要
  2. 在回调中,根据需要做出响应,我正在检查它是否有相关的产品信息 如果它没有问题 否则我调用下游端点使用catologueItemId获取更多相关的产品信息。(这里我使用的是deasync)
  3. 这需要的时间超过了所需的时间。

    任何人都可以建议任何替代方案吗?

    使用代码进行更新:common-nodejs是我们编写的一个库,它包含许多功能,例如使用restify调用其余端点,读取应用程序配置等等。下面的代码是打字稿。 希望这会有所帮助。

        import {log,serviceInfo,HttpMethod} from "common-nodejs";
        import { CloudsenseBaasJsonAction } from './cloudsense-baas-connector';
        import {Constants} from "./Constants";
        let request = require('request');
        let deasync = require('deasync');
        let moment = require("moment");
        let async= require("async");
        let PropertiesReader = require("properties-reader");
         let endpointsConfigFile = require("../../config/endpoints.json");
         //load the properties file to map the cloudsense attributes with        required keys.
         let parseConfig=new  PropertiesReader("config/fields_config.properties");
    
          // helper method  in adding more details in response by reading the properties file
         export let parsePropertiesFile =            function(attribute,microserviceResponse,key,value){
         let cloudSenseKey = attribute[key];
         let microServiceKey = parseConfig.get(cloudSenseKey);
         //console.log("********cloudSenseKey***************",cloudSenseKey,"************ microServiceKey***" ,microServiceKey);
         if( microServiceKey!= undefined && microServiceKey!=null){
        // console.log("********microServiceKey***************",microServiceKey  ,attribute[value]);
          microserviceResponse[microServiceKey] = attribute[value];
         }
    
         };
         // this method does the fetching the detailed info if relatedProducts are there
         export let requestRelatedProductsInfo = function(offerId):any{
         //  console.log("****************Above to Parse*******");
         let body={};
          let cloudsenseBaasJsonAction = new  CloudsenseBaasJsonAction(HttpMethod.GET, body, '');
          let sendRequestForRelatedProducts = deasync(function(callback){
           request({
             proxy: serviceInfo.extras.internetProxy,
            url:  serviceInfo.extras.serviceCloudsense.apiEndpoint+"/services/current/offer/"+offerId+"/products",
             method: endpointsConfigFile.cloudsense_baas.offers.method,
             headers: cloudsenseBaasJsonAction.modifyHeadersWithParams({
                "csTime": Date.now(),
                "method":   HttpMethod[endpointsConfigFile.cloudsense_baas.offers.method],
                "path": "/services/current/offer/"+offerId+"/products",
                "clientKey": serviceInfo.extras.serviceCloudsense.clientKey,
                "clientSecret":  serviceInfo.extras.serviceCloudsense.clientSecret
            })
        },function (err, res, body) {
            if(res.statusCode==404 || res.statusCode==500){
                console.log("********res***offerId*************",res.statusCode,offerId);
            }
    
            if(err){
                // console.log("*****************Errors****************",err);
                callback(err,null);
            }
            callback(null,body);
        });
    });
    return JSON.parse(sendRequestForRelatedProducts());
            }
           export class Parser {
    
    /*
     * This method is used to massage the cloudsense data and respond with the below formate
     *
     * {
     *        "catalogueId": "a26O0000000SOS7IAO",
     *       "price": 1536,
     *        "name": "IPHONE 6S PLUS",
     *        "default": "true",
     *        "color": "Silver",
     *        "memory": "128GB",
     *        "contentId": "IPHONE6S128GBSILVER",
     *        "featured": "true",
     *        "isOutright": "Outright",
     *        "brand": "Apple",
     *        "startdate": "01-09-2016",
     *        "enddate": "01-09-2017",
     *        "OS": "iOS",
     *        "bluetick": true
     *    }
     *
     *
     */
    public parseCloudsenseData(CloudsenseData:any,isDefaultFlow : boolean):any{
        console.log('*******isDefaultFlow********',isDefaultFlow);
        let current_Date = moment().format(Constants.DateFormate);
        let  parseCloudData = function(result,callback){
            try{
                let microserviceResponse={
                    "catalogueId"      :    result.catalogueId,
                    "catalogueItemId"  :   result.catalogueItemId,
                    "outrightPrice"    :   result.cscfga__One_Off_Charge__c,
                    "displayName"      :   result.name,
                    "currentDate"      :   current_Date,
                    "recurringPrice"   :   result.cscfga__Recurring_Charge__c
                };
                let key = Constants.Name;
                let value = Constants.Value;
                //fetch the list of attributes.
                for(let att of result.attributes){
                    parsePropertiesFile(att,microserviceResponse,key,value);
                }
                debugger;
                //fetching the relatedProducts Data. if there are relatedProducts calling the endpoint to get more details 
                if(!isDefaultFlow && result.relatedProducts!= undefined && result.relatedProducts!=null  && result.relatedProducts.length>0 ){
    
                    let microserviceRelatedProductArray=[];
                  // debugger;
                  //   result.catalogueItemId = 'caf71d86-bca3-4bed-a2d5-b233305b8e76'
                    let relatedProductArray = requestRelatedProductsInfo(result.catalogueItemId);
                    for(let relatedProduct of relatedProductArray.results){
                    //     for(let relatedProduct of relatedProductArray){
                        let finalRelatedProduct ={
                            "productId"        :   relatedProduct.productId,
                            "name"             :   relatedProduct.name,
                            "sku"              :   relatedProduct.sku,
                            "productType"      :   relatedProduct.productType,
                            "productSubType"   :   relatedProduct.productSubType,
                            "outrightPrice"    :   relatedProduct.cscfga__One_Off_Charge__c,
                            "recurringPrice"   :   relatedProduct.cscfga__Recurring_Charge__c,
                            "contentId"        :   '',
                            "mobileRepaymnetOption":''
                        };
                        //This loop is there to find the content_id among available attributes dynamically.
                        for(let att of relatedProduct.attributes){
                            parsePropertiesFile(att,finalRelatedProduct,key,value);
                        }
                        microserviceRelatedProductArray.push(finalRelatedProduct);
                    } // end of for loop.
                    microserviceResponse.relatedProducts =microserviceRelatedProductArray;
                }//end of if. ( view details flow).
                // if(!isDefaultFlow && result.relatedProducts!= undefined && result.relatedProducts!=null  && result.relatedProducts.length>0 ) {
                // var catalogueItemIdArray = [];
                //     catalogueItemIdArray.push(result.catalogueId);
                // }
                return callback(null,microserviceResponse);
            }catch(error){
                // log.debug("************error block**********",error);
                return callback(error,null);
            }
        };
    
        let microServiceOutput;
        //calling the parseCloudData method asynchronusly for each element in the array.
        async.map(CloudsenseData.results, parseCloudData ,function (error,result){
    
            if(error){
                // console.log("***************Error***************",error);
                microServiceOutput = {
                    "code":1005,
                    "message": "The downstream is not available"
                };
                return microServiceOutput;
            }
    
            microServiceOutput = result;
        });
    
    
    
        return microServiceOutput;
    }//End of parseCloudsenseData();
    

    }

0 个答案:

没有答案