从异步方法返回数据的服务 [英] Service that returns data from an asynchronous method
问题描述
geturl
服务,该服务应该会在我的应用程序中返回几个模型/动作的URL。我现在在我的模板中调用这个服务。 (正如我独自开发这个,如果这种设计模式是错误的,请不要犹豫提醒我) p>
现在出现Waterline的 .find()
方法是异步的(它应该)。在数据库中插入或提取内容时,我总是使用回调函数来执行操作。
现在我已经看到 ,我无法从异步方法返回任何数据。因此我很困惑,因为我想创建这个[该死的]服务来集中URL管理。
这是我当前的代码:
module.exports = {
variete:function(id_objet){
var string ='/ default_url';
return onvariete(id_objet,function(err,url){
if(err){
sails.log.error('Error:',err);
} else {
返回网址;
}
});
}
};
function onvariete(id_objet,next){
var url ='/';
return Variete.findOne({id:id_objet})。exec(function(err,v){
sails.log.info('URL Variety:'+ v.nom +'/'+ id_objet +'+'+ v.slug);
if(err){
sails.log.error('Error:'+ v.nom +'/'+ err);
/ /不做任何事。
return next(new Error('Variete error'),undefined);
} else if(!v){
return next(new Error('Variete not found' ),undefined);
} else if(!v.slug){
// variete没有slug字段
//我们重定向到/ v /:id
url + ='v /'+ v.id;
return next(null,url);
} else {
// Ok variete得到了一个slug字段
sails .log.info('GOT A SLUG!'+ v.slug);
url + ='variete /'+ v.slug;
return next(null,url);
}
});
}
我做了一个 static
嵌入我的 geturl
服务,然后在Jade模板中的对象:
a(href =#{s.geturl.variete(ann.variete.id)}title =#{ann.variete.name})#{ann.variete.name}
我可以得到类似于:
< a title =Tomate Coeur de Boeufhref =undefined> Tomate Coeur de Boeuf< / a>
预先感谢您。
.url(bool)
实例方法。请参阅如何在Sails / Waterline中编写实例方法。 这样我直接从我的模板访问这个方法: a(href =#{ann.variete.url()}title =#{ann.variete.name})#{ann。 variete.name}
。
完成!
I am using Sails' ORM (Waterline). I have written a geturl
service that should return the url of several models/actions in my app. I am currently calling this service inside my templates.
(As I am alone to develop this, don't hesitate to warn me if this design pattern is wrong)
Now it occurs that Waterline's .find()
method is asynchronous (as it should). I always use callbacks to do things when inserting or fetching things in database.
Now I have seen everywhere that I cannot return any data from asynchronous methods. As a consequence I am puzzled because I want to create this [damned] service to centralize the URL management.
Here is my current code:
module.exports = {
variete: function(id_objet) {
var string = '/default_url';
return onvariete(id_objet, function (err, url) {
if (err) {
sails.log.error('Error : ', err);
} else {
return url;
}
});
}
};
function onvariete(id_objet, next) {
var url = '/';
return Variete.findOne({id:id_objet}).exec(function (err, v) {
sails.log.info('URL Variety : '+ v.nom + ' / ' +id_objet + ' / ' + v.slug);
if (err) {
sails.log.error('Error : ' + v.nom + ' / ' + err);
// Do nothing.
return next(new Error('Variete error'), undefined);
} else if (!v) {
return next(new Error('Variete not found'), undefined);
} else if (!v.slug) {
// variete doesn't have a slug field
// we redirect to /v/:id
url += 'v/' + v.id;
return next (null, url);
} else {
// Ok variete has got a slug field
sails.log.info('GOT A SLUG! ' + v.slug);
url += 'variete/' + v.slug;
return next (null, url);
}
});
}
I made a static
object that embeds my geturl
service, and then inside a Jade template:
a(href="#{s.geturl.variete(ann.variete.id)}" title="#{ann.variete.name}") #{ann.variete.name}
And I can get something like:
<a title="Tomate Coeur de Boeuf" href="undefined">Tomate Coeur de Boeuf</a>
Thank you by advance.
The solution vas to write a .url(bool)
instance method. See how to write instance methods in Sails / Waterline.
This way I directly access this method from my template : a(href="#{ann.variete.url()}" title="#{ann.variete.name}") #{ann.variete.name}
.
Done!
这篇关于从异步方法返回数据的服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!