何时以及如何在承诺完成时返回http响应?

时间:2014-03-12 20:24:07

标签: javascript api http response promise

我有以下代码

api.stuff_by_id = function (req, res) {
    var collection = collectionName;
    var search = getLuceneSearchString(req.body);

    luceneDb.search(collection, search)
        .then(function (result) {
            var result_message = result.body;
            console.log(result_message);
            res.send(result);  // this is the response I'd actually like to see returned.
        })
        .fail(function (err) {
            console.log(err);
            res.send(err);  // or this one if there is an error.
        })

    res.send('test');  // however this is the only one that gets returned.
};

我意识到,在针对此调用执行curl请求时将显示的唯一响应是最后一个响应,因为其他响应仍在处理一瞬间。但是我实际上需要让res.send(result)或res.send(err)调用给出响应而不是res.send(' test')。有什么方法可以使服务器等待响应其中一个正确的响应?有没有办法等待某种方式或其他方法来做到这一点?

谢谢!

解决方案 (@ NotMyself在下面回答,但帮助我离线了解以下代码)。解决方案相当容易,但最初并不完全明显。

我们将抽象提升到了更好的水平,其中api.stuff_by_id刚刚返回了luceneDb.search函数返回的promise的承诺。一旦它被冒泡到上层,然后使用,然后在完成承诺的完成后,将响应(res.send)发送回客户端。这是以后方法的样子。

帖子的功能设置如下:

app.post('/identity/by',
    passport.authenticate('bearer', { session: false}),
    function (req, res) {
        luceneDb.search(req.body)
            .then(function (result) {
                res.send(result);
            })
            .fail(function (err) {
                res.statusCode = 400;
                res.send(err);
            });
    });

和luceneDb.search函数如下所示:

luceneDb.search = function (body) {
    var collection = data_tier.collection_idents;
    var search = getLuceneSearch(body);

    if (search === '') {
        throw new Error
        'Invalid search string.';
    }

    return orchestrator.search(collection, search)
        .then(function (result) {
            var result_message = result.body;
            console.log(result_message);
            return result.body;
        })
};

也减少了对问题的泄漏。

2 个答案:

答案 0 :(得分:2)

您需要删除res.send(' test');.你把它写成发送的方式将在承诺发生变更之前完成请求。

答案 1 :(得分:1)

res.send(' test')的问题是响应将在Lucene调用结束之前发送给客户端,因此,客户端已经消失了有第二个res.send。

关于承诺,我使用.them(函数(结果){},函数(错误){});不是.then()。fail(),你用什么模块?

对于LuceneDB你也使用什么模块?我只是好奇。