node.js - 从异步方法返回数据的服务

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

我创建了一个嵌入我的 geturl 服务的 static 对象,然后将其放入 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) 实例方法。请参阅how to write instance methods in Sails / Waterline .

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

完成!

关于node.js - 从异步方法返回数据的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26463552/

相关文章:

node.js - 使用 Node.js 在文件开头插入

node.js - 在 now.js/socket.io 聊天中增强安全性

javascript - 何时将函数标记为异步

functional-programming - 什么是欣德利米尔纳?

javascript - 如何使用 Microsoft-Graph 和 NodeJS 按日历名称获取日历事件?

node.js - 如何在Socket.IO中向特定命名空间的客户端广播消息?

ios - NSURLConnection 异步不工作

javascript - 执行函数作为异步 Node.js 脚本的最后一件事

scala - 用于状态转换的 flatMap() 的实现

scala - 带有逻辑的案例类的惯用方式是什么