Nodejs - SolrClient,如何等待响应

时间:2014-10-25 19:45:35

标签: javascript node.js asynchronous solr client

我有一个关于nodejs的solr-client模块的问题。我使用此模块查询solr-index。

模块本身工作正常,只要我不必等待查询完成,只要我只需要将结果作为异步结果。

但目前我无法找到,我将如何等待搜索请求的完成并以顺序方式使用结果。

我的经理中有以下方法

SolrManager.prototype.promisedQuery = function(query, callback) {
var solrClient = solr.createClient(this.configuration.cores.page);

var docs = null;
var finished = false;
var deferred = Q.defer();

var request = solrClient.search(query, function(err,obj){
    if (!err) {
        if (obj.response.numFound > 0) {
            deferred.resolve(obj.response.docs);
        } else {
            deferred.resolve(null);
        }
    } else {
        deferred.reject(err);
    }
});

var records = null;
var promise = deferred.promise;
promise.then(function(result) {
    records = result;
}).fail(function(error){
    records = error;
});

return records;

};

这里的问题是,我试图等待查询的结果并将其用作" promisedQuery"的返回值。

我尝试在顺序调用中使用此方法,也使用不同的附加模块,如" wait.for"," q"等,但似乎没有任何效果。

solr-client的回调函数将始终在manager-method返回后执行。在从manager-method返回后,甚至会调用promise方法。

有人可以帮我解决这个话题或提供一些提示,我如何等待solr-client-search操作的响应然后按顺序返回?

感谢您的帮助。

Udo Gerhards

3 个答案:

答案 0 :(得分:1)

超过一周,现在看来我找到了一个解决方案:

SolrManager.prototype.promisedQuery = function(query, callback) {
var solrClient = solr.createClient(this.configuration.cores.page);

var docs = null;
var deferred = Q.defer();

var request = solrClient.search(query, function(err,obj){
    if (!err) {
        if (obj.response.numFound > 0) {
            deferred.resolve(obj.response.docs);
        } else {
            deferred.resolve(null);
        }
    } else {
        deferred.reject(err);
    }
  });

return deferred.promise;
};

在调用上述函数的所有其他管理器中:

...
var dbPromise = this.solrManager.promisedQuery(query);

var _self = this;
return Q.async(function*(){
    var result = yield dbPromise;
    return result;
});
...

在第一次测试之后,似乎同步方法将等到承诺结算。

唯一的一点是,它只运行NodeJs版本0.11.10,它支持生成器功能,激活了 - harmony -flag和“q”-module。

祝你好运

答案 1 :(得分:0)

你只是错误地使用了承诺。您无需返回记录,而是需要返回" deferred.promise'。它应该看起来像这样(请注意,您不需要传递给promisedQuery的回调)。

SolrManager.prototype.promisedQuery = function(query) {
    var solrClient = solr.createClient(this.configuration.cores.page),
    deferred = Q.defer();

    solrClient.search(query, function(err,obj){
        if (!err) {
            if (obj.response.numFound > 0) {
                deferred.resolve(obj.response.docs);
            } else {
                deferred.resolve(null);
            }
        } else {
            deferred.reject(err);
        }
    });

    return deferred.promise;
};

要使用它,您可以执行以下操作:

SolrManager.promisedQuery(myquery)
    .then(function (data) {
        // data is whatever your 'resolved' in promisedQuery
    }, function (err) {
        // err is whatever you rejected in promisedQuery
    });

答案 2 :(得分:0)

基于rquinns回答我改变了代码如下:

SolrManager.prototype.promisedQuery = function(query, callback) {
var solrClient = solr.createClient(this.configuration.cores.page);

var docs = null;
var finished = false;
var deferred = Q.defer();

var request = solrClient.search(query, function(err,obj){
    if (!err) {
        if (obj.response.numFound > 0) {
            deferred.resolve(obj.response.docs);
        } else {
            deferred.resolve(null);
        }
    } else {
        deferred.reject(err);
    }
});

return deferred.promise;
};

...

DemoObject.prototype.toString = function() {
 return SolrManager.promisedQuery(this.query).then(function(result){
   return result['title'];
 }).fail(function(error){
   return error;
 });
};

DemoObject.prototype.typeOf = function() {
 return SolrManager.promisedQuery(this.query).then(function(result){
   return result['title'];
 }).fail(function(error){
   return error;
 });
};

我认为,这是使用“承诺”对象的正确方法。但是当我这样做时会发生什么:

...
var demoObject = new DemoObject();
demoObject.query = "id:1";
console.log(''+demoObject);
...

或者如果我通过将它连接到字符串

来使用“demoObject”
...
var string = "Some string "+demoObject;
...

在字符串连接的情况下,我目前不确定该字符串是否还包含数据库中的title字段。控制台输出相同。

nodejs是否如此智能以至于它可以解析为例如字符串连接“之后”数据库的结果是否可用?

BR