从asynchronous方法返回数据的服务

我正在使用Sails的ORM(水线)。 我已经写了一个geturl服务,应该返回我的应用程序中的几个模型/动作的url。 我目前在我的模板中调用这个服务。

(正如我独自开发这个,如果这种devise模式是错误的,请不要犹豫提醒我)

现在Waterline的.find()方法是asynchronous的(它应该)。 在数据库中插入或提取事物时,我总是使用callback函数来执行操作。

现在我已经看到无处不在 ,我不能从asynchronous方法返回任何数据。 因此我感到困惑,因为我想创build这个[该死的]服务来集中URLpipe理。

这是我现在的代码:

 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); } }); } 

我做了一个static对象,embedded我的geturl服务,然后在一个Jade模板中:

 a(href="#{s.geturl.variete(ann.variete.id)}" title="#{ann.variete.name}") #{ann.variete.name} 

我可以得到像这样的东西:

 <a title="Tomate Coeur de Boeuf" href="undefined">Tomate Coeur de Boeuf</a> 

先谢谢您。

解决方法是编写一个.url(bool)实例方法。 了解如何在Sails / Waterline中编写实例方法 。

这样我直接从我的模板访问这个方法: a(href="#{ann.variete.url()}" title="#{ann.variete.name}") #{ann.variete.name}

完成!