SailsJs,如何让模型函数成为Promise,以便我可以在控制器中对它们进行排队?

时间:2016-09-20 14:17:40

标签: javascript sails.js

我可能有点偏离基础,但我需要进行几次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----

在这里你可以看到来自控制器的console.log首先写入,并且提供程序是未定义的,但是一旦模型函数从get请求中获取数据,它就会被正确地写入控制台,以及&# 34; ---提供者模型---"旗帜

提前感谢任何指导。

我靠得很近,但是承诺仍然在控制器中,而不是它们在模型中......

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

1 个答案:

答案 0 :(得分:0)

您可以使用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);