繁体   English   中英

Node.js-SolrClient,如何等待响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM