超级代理/带有异步的超级测试/等待

时间:2018-07-20 09:03:14

标签: javascript node.js async-await es6-promise superagent

目标是正确设置变量val rabbitParams = Map("storageLevel" -> "MEMORY_AND_DISK_SER_2", "queueName" -> config.getString("application.rabbitmq.queue"), "exchange" -> config.getString("application.rabbitmq.exchange"), "host" -> config.getString("application.rabbitmq.host"), "port" -> config.getString("application.rabbitmq.port"), "routingKeys" -> config.getString("application.rabbitmq.queue") ) /*val distributeKey = Seq( RabbitMQDistributedKey( config.getString("application.rabbitmq.queue"), new ExchangeAndRouting(config.getString("application.rabbitmq.exchange"), "query.analyzer"), rabbitParams ) )*/ val receiverStream: InputDStream[String] = RabbitMQUtils.createStream( ssc, rabbitParams) receiverStream.start() receiverStream.foreachRDD( rdd => { if(!rdd.isEmpty()){ // Processing } } 以便进一步使用,因此我想重构函数loginUser:

auth

像这样使用异步/等待(没有回调):

function loginUser(user, request, auth) {
  return function(done) {
    request
      .post('/users/login')
      .send(credentials)
      .expect(200)
      .end(onResponse);

    function onResponse(err, res) {
      auth.token = res.body.token;
      return done();
    }
  };
}


 loginUser(user, request, auth)(function() {
  request.get(testUrl)
    .set('Authorization', `bearer ${auth.token}`)
    .expect(200, done);
});

但是我正在努力正确地返回/设置auth = await loginUser(user, request); request.get(testUrl) .set('Authorization', `bearer ${auth.token}`) .expect(200, done); (如果我将auth作为参数或返回值并不重要)。

我尝试过的东西是这样的:

auth

但是async function loginUser(user, request) { let auth; await request .post('/users/login') .send(credentials) .expect(200) .end(onResponse); function onResponse(err, res) { auth.token = res.body.token; } return auth; } 的设置从未正确。

2 个答案:

答案 0 :(得分:4)

请勿使用“ end”语法,该语法用于回调:

const response = await request.post(...)
  .expect(200)
const {body: {token}} = response
return token

基本上应该看起来像同步代码

答案 1 :(得分:2)

问题在于由于Nodejs中的事件循环,onResponse方法的执行时间晚于函数返回的时间。因此,您必须在收到数据时准确地兑现承诺

loginUserInternal方法可能像这样:

function loginUserInternal(user, request) {
  return new Promise((resolve,reject) => {
    let auth = {};
    request
      .post('/users/login')
      .send({
        username: user.username,
        password: user.password_decoded,
      })
      .expect(200)
      .end(onResponse);
    function onResponse(err, res) {
      if(err) return reject(err)
      auth.id = res.body.id;
      auth.token = res.body.token;
      auth.tokenExpires = res.body.tokenExpires;
      resolve(auth)
    }
  })
}

像在异步等待时一样调用它。

相关问题