从异步方法返回数据的服务 [英] Service that returns data from an asynchronous method

查看:105
本文介绍了从异步方法返回数据的服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Sails的ORM(水线)。我写了一个 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆