![](/img/trans.png)
[英]How to wait for each iteration in for loop and return response as API response in nodeJS
[英]Nodejs - SolrClient, how to wait for response
我对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的回调函数将始终在管理器方法返回后执行。 从管理器方法返回后,甚至还会调用promise方法。
有人可以在这个主题上为我提供帮助或获得一些提示吗,我如何等待solr-client-search操作的响应,然后以顺序的方式将其还给我?
谢谢你的帮助。
乌多·格哈兹(Udo Gerhards)
一周多了,现在看来我找到了解决方法:
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” -模块运行。
最好的祝福
你做
您只是错误地使用了诺言。 而不是返回记录,您需要返回“ 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
});
基于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;
...
如果是字符串连接,我目前不确定该字符串是否还将包含数据库中的标题字段。 控制台输出相同。
nodejs是否会如此智能,以至于它可以解决数据库结果之后的字符串串联等问题?
BR
你做
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.