0

我是 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() 让我相信它已成功连接和调用任务

它没有连接到芹菜吗?我把任务叫错了吗?这不应该是一个时间问题,因为我已经执行了这个并且等待了 10 分钟仍然没有结果。我对此很陌生,所以任何帮助将不胜感激

4

1 回答 1

0

您从未调用过resolvereject在您创建的 Promise 中。

此外,根据您在评论中链接的页面上的示例,您应该将回调函数作为参数提供给client.call,如下所示:

client.call('tasks.add', [1, 2], resolve)

resolve与回调具有相同的签名,因此您可以直接传递它)

编辑:为什么不起作用result.on('ready', fn)

因为您使用的是 Redis 后端。这仅适用于 AMQP 后端。

于 2021-04-01T20:40:52.267 回答