我可能有点偏离基础,但我需要进行几次api调用来收集显示在视图上所需的数据。
我一直在阅读关于Q和Bluebird及其Promises但我似乎无法使其工作,它继续渲染视图而不从模型中获取数据(异步)。
我的问题是(是):
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});
});
答案 0 :(得分:0)
您可以使用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);