我有一个关于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
答案 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
乌