【问题标题】:SailsJs, how can I make a model function a Promise so I can queue them in the controller?SailsJs,我怎样才能使模型函数成为 Promise,以便我可以在控制器中将它们排队?
【发布时间】:2016-09-20 14:17:39
【问题描述】:

我可能有点偏离基础,但我需要进行几次 api 调用来收集在视图上显示所需的数据。

我一直在阅读有关 Q 和 Bluebird 及其 Promises 的信息,但我似乎无法使其正常工作,它会继续渲染视图而无需从模型中获取数据(异步)。

我的问题是:

  • 这是获取多个 api 调用的最佳方法吗?我想将它们保留在模型中(MVC 风格)
  • 我是否应该从视图中渲染每个 api 调用,以便以某种方式获得 div 的加载器图像?
  • 如果我在正确的轨道上,为什么它不“等待”要返回的数据,或者为什么当数据可用时它不加载数据?

ProvidersController.js

var Promise = require("bluebird");

module.exports = {
  ...
  ...  
  findOne: function(req, res){
    var rest        = require('restler');
    var provider_id = req.params.id;

  if(!req.session.token){
    req.flash('error', 'No Token Present in Session');
    res.redirect("/user/login");
  }

  Promise.all([
    Providers.getData(1, req.session.token),
    //todo more model functions

  ]).spread(function(provider_promise, yetAnotherResult) {
    var data = {
     thing: "Lorem ipsum dolor sit.",
     provider: provider_promise,
     //otherthing: yetAnotherResult
  };
  console.log(data);
  return res.view({data: data});
});

Provider.js

var Promise = require("bluebird");

module.exports = {

attributes: {
},

getData: function(provider_id, token){

  var rest        = require('restler');
    rest.get('HTTPS://THIS_URL'+provider_id, {
    headers: {'Authorization': 'Bearer '+ token},
  }).on('complete', function(data, response) {
    if (response.statusCode == 200) {
      console.log(JSON.parse(data).data);
      console.log("----Provider Model----");
      return JSON.parse(data).data;
    }
  });
}
};

当我点击页面时,这是控制台中的输出

{ thing: 'Lorem ipsum dolor sit.', provider: undefined }
{ type: 'provider',
 id: '1', attributes: { provider_id: 1, provider_name: 'Ron Somebody' }
}
----Provider Model----

这里你可以看到controller的console.log先写,provider是未定义的,但是一旦model函数从get请求中得到数据,就会正确的写到console,连同“- --提供者模型---"标志

提前感谢您的任何指导。

我离得更近了,但 promise 仍然在控制器和 id 中,而不是它们在模型中..

...
...
var request     = Promise.promisify(require('request'));

...
...
Promise.all([
  request({url: 'URL_1', headers: {'Authorization': 'Bearer '+ req.session.token } }),
  request({url: 'URL_2', headers: {'Authorization': 'Bearer '+ req.session.token } }),
  request({url: 'URL_3', headers: {'Authorization': 'Bearer '+ req.session.token } }),
]).spread(function(provider_obj, user_objs, classes_objs) {
  var data = {
    titleorpagedesc:  "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris gravida turpis et elit condimentum sit amet tempus tellus semper.",
    provider:         JSON.parse(provider_obj.body),
    users:            JSON.parse( user_objs.body ),
    classes:          JSON.parse( classes_objs.body )
  };
  // console.log(data);
  return res.view({data: data});
});

【问题讨论】:

    标签: javascript sails.js


    【解决方案1】:

    你可以使用Q库

    https://www.npmjs.com/package/q

    你可以为你的函数编写

    var Q=require("q"); // should be placed at the top of file
    var rest = require('restler'); //should be placed at the top of file
    
    
          getData: function(provider_id, token){
               var deferred = Q.defer();
               rest.get('HTTPS://THIS_URL'+provider_id, {
                     headers: {'Authorization': 'Bearer '+ token},
                }).on('complete', function(data, response) {
                          if (response.statusCode == 200) {
                              console.log(JSON.parse(data).data);
                              console.log("----Provider Model----");
                              deferred.resolve(JSON.parse(data).data); //promise is resolved here
                          }
               });
             return deferred.promise;
         }
    

    因为你没有处理错误案例所以我没有写拒绝案例

    但是如果出现错误,您可以使用

    拒绝承诺
    deferred.reject(error);
    

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-03
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多