目标是正确设置变量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;
}
的设置从未正确。
答案 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)
}
})
}
像在异步等待时一样调用它。