Node JS Controller - 调用具有回调函数

时间:2015-07-30 19:10:59

标签: javascript node.js javascript-events

我的控制器是肥皂客户端,如下所示

    var _ = require('lodash'),
    memoize = require('memoize'),
    soap = require('soap'),
    http = require('http');
    var wsdlUrl = 'http://www.proxixnetwork.com/gsert/PxPointGeocode.asmx?WSDL';

    var geocode = function(req,res){
      var sessionId = null;
      soap.createClient(wsdlUrl, function(err,client){
          var args = {"username":'user123', "password":'password123'};
          client.PxPointGeocode.PxPointGeocodeSoap.Authenticate(args,function(err,result){
          res.jsonp(result.AuthenticateResult.SessionID);
        })

      });

    }

    exports.authenticate = geocode;

此soap服务提供将在后续请求中使用的会话ID。因此,我想使用' memoize'缓存方法。

我定义了一个包围soap调用的方法,然后记住它,但问题是对soapClient的调用没有发生。

我不知道如何从路由器拨打电话等待soap呼叫 注意:还尝试过async库的瀑布,但没有用。

    var _ = require('lodash'),
      memoize = require('memoize'),
      soap = require('soap'),
      http = require('http'),
      wsdlUrl = 'http://www.proxixnetwork.com/gsert/PxPointGeocode.asmx?WSDL';

    var getSession = function () {

      var args = {"username": 'user123', "password": 'password123'};
      var sessionId = null;
      soap.createClient(wsdlUrl, function (err, client) {
        console.log('Inside proxix client'); //not printing
        client.PxPointGeocode.PxPointGeocodeSoap.Authenticate(args, function (err, result) {
          sessionId= result.AuthenticateResult.SessionID; 
        //if I use res.jsonp() - the call could be made 
        })

      });
    return sessionId;
    };

    var cached = memoize(getSession);

    var geocode = function (req, res) {
      var sesssionObj = cached();
      res.jsonp(sessionObj);

    }
    exports.authenticate = geocode;

1 个答案:

答案 0 :(得分:0)

我看到的两个问题是:

  1. memoize是一种缓存机制,但决不会改变你的函数的异步性质。返回sessionId将无法正常工作,因为它未到达该行之前未设置。您需要使用回调。
  2. 您尚未指定要将memoize用于缓存的参数,也未指定获取这些值的位置。我将假设这个例子是用户名,密码和wsdlUrl。并且它们直接设置在req。
  3. var _ = require('lodash'),
    memoize = require('memoize'),
    soap = require('soap'),
    http = require('http');
    
    var getSessionId = function(username,password,wsdlUrl,callback){
        soap.createClient(wsdlUrl, function(err,client){
            var args = {"username":username, "password":password};
            client.PxPointGeocode.PxPointGeocodeSoap.Authenticate(args,function(err,result){
                if(err){
                    return callback(err);
                }
                callback(null,result.AuthenticateResult.SessionID);
            })
        });
    });
    
    var getSessionIdCached = memoize(getSessionId,{async:true});
    
    var geocode = function(req,res){
        getSessionIdCached(req.username,req.password,req.wsdlUrl,function(err,sessionId){
            if(err){
                //do some error handling, and probably return
            }
            res.jsonp(sessionId);
        });
    });
    
    exports.authenticate = geocode;