问题描述
我是 node-celery 的新手,我试图通过从 celery 任务中获取结果来开始简单。我已经以“等待”的方式编写了我的 JS,以便等待 celery 的结果然后继续前进,但是,似乎 JS 永远不会从“client.call('task')”中得到结果>
芹菜代码:
@app.task(base=QueueOnce)
def add(x,y):
return x + y
节点JS代码:
async function addCelery() {
client = celery.createClient({
CELERY_broKER_URL: "redis://myurl.com:0000"
});
let clientResult = new Promise((resolve,reject) => {
console.log("Log 1"); //This shows in the console
client.on('connect',() => {
console.log("Log 2"); //This also shows in console,making me believe it connected successfully
var call = client.call('tasks.add',[1,2]); //Call task
console.log("Log 3"); //This also shows in console,making me believe the task call is called successfully
call.on('ready',function(result){ //When call gets result
console.log(result); //Never gets here
});
});
})
await clientResult;
console.log('done'); //Never gets here
我不确定为什么它永远不会过去,永远不会从通话中得到结果。我用于调试的很多 console.log() 让我相信它已成功连接并调用任务
是不是连接到了celery?我调用任务错了吗?这不应该是一个时间问题,因为我已经执行了这个并等待了 10 分钟仍然没有结果。我对此很陌生,因此将不胜感激
解决方法
您从未在您创建的 Promise 中调用 public class UserModelValidator : AbstractValidator<UserModel>
{
public UserModelValidator(IActionContextAccessor actionContextAccessor)
{
RuleFor(item => item.Username)
.MustAsync(async (context,username,propertyValidatorContext,cancellationToken) =>
{
var userId = (string)actionContextAccessor.ActionContext.RouteData.Values
.Where(o => o.Key == "userId")
.Select(o => o.Value)
.FirstOrDefault();
return true;
});
}
}
或 resolve
。
此外,根据您在评论中链接的页面上的示例,您应该提供回调函数作为 reject
的参数,如下所示:
client.call
(client.call('tasks.add',[1,2],resolve)
与回调具有相同的签名,因此您可以直接传递它)
编辑:为什么 resolve
不起作用?
因为您使用的是 Redis 后端。这仅适用于 AMQP 后端。