从异步方法返回数据的服务

时间:2014-10-20 10:34:08

标签: node.js asynchronous functional-programming sails.js waterline

我正在使用Sails的ORM(Waterline)。我写了一个geturl服务,应该在我的应用程序中返回几个模型/操作的URL。我目前正在我的模板中调用此服务。

(因为我独自开发这个,如果这种设计模式错误,请不要犹豫警告我)

现在,Waterline的.find()方法是异步的(应该如此)。在数据库中插入或提取东西时,我总是使用回调来做事。

现在我看到everywhere我无法从异步方法返回任何数据。因此,我很困惑,因为我想创建这个[该死的]服务来集中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 {
              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服务的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>

先谢谢你。

1 个答案:

答案 0 :(得分:1)

解决方案写入.url(bool)实例方法。请参阅how to write instance methods in Sails / Waterline

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

完成!