节点通过Q服务承诺传递参数

时间:2015-08-11 18:30:57

标签: node.js q

我在节点中设置了中间件来执行任务,并在成功或失败时调用下一个任务。在初始承诺块运行后调用该任务。它在.then函数中调用:

var Q  = require('q');

var dataPromise = getCustomerId();

dataPromise  
   .then(function(data) {
         getGUID(req, res, next);
      }, function(error) {
         console.log('Failure...', error);
    });  

};

服务器挂起,因为在.then函数的上下文中,(req,res,next)参数都是未定义的。

这是getCustomerId函数:

var getCustomerId = function() {

var getCustomerIdOptions = {
  options...
};

var deferred = Q.defer();
request(getCustomerIdOptions, function(err,resp,body){
  if(err){
    deferred.reject(err);
    console.log(err);
    return;
  }else{
    deferred.resolve(body);
  }

});
return deferred.promise;
};

将这些参数传递给.then块中调用的函数的正确方法是什么?

编辑: (req,res,next)参数来自外部函数,并且在.then()块之外调用getGUID(req,res,next)时可以访问。

 var assureGUID = function(req, res, next) {
   if(app.locals.guid){ 
    next();
   return;
 }

 var dataPromise = getCustomerId();

 dataPromise  
  .then(function(data) {
      getGUID(req, res, next)
  }, function(error) {
     console.log('Failure...', error);
  }).;
};

1 个答案:

答案 0 :(得分:0)

不确定您要做的是什么,但您可以在快速公共中间件函数中调用您的promise函数,如下一个示例。

var express = require('express');
var $q = require('q');
var request = require('request');


var app = express();

// Middleware 1
app.use( function(req, res, next) {
  console.log('i\'m the first middleware');

  getCustomerId().then( function(body) {
    console.log('response body', body);
    return next();
  },
  function(err) {
    console.log('Error on middlware 1: ', err);
  });

});


// Middleware 2
app.use( function(req, res, next) {
  console.log('i\'m the second middleware');
  return next();
});


app.get('/', function(req, res) {
  res.send('hi world');
});


app.listen(3000);


// Your custom function definition
function getCustomerId() {

  var deferred = $q.defer();

  request('http://someurltogetjsondata/user/id',  function(err, resp, body) {
    if(err) return deferred.reject(err);
    deferred.resolve(body);
  });

  return deferred.promise;
}

我希望这会有所帮助,祝你好运。