【发布时间】: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