我正在尝试理解承诺,我需要链接它们并装饰来自不同端点的对象宽度数据。
例如:
我在我的node-express app
中有这个//controller.js
export const getItem = (req, res) => {
ItemService.getItem(req.params.id).then(function(item) {
return res.json({ 'success': true, 'message': 'Item found successfully', 'item': item});
}).catch(function(result) {
return res.json({ 'success': false, 'errorMessage': 'Ups!' });
});
};
//itemService.js
export const getItem = function(id){
return new Promise(function(resolve, reject) {
fetch(apiUrls.getItem(id))
.then(response => {
if(response.ok){
response.json().then(data => {
resolve(data);
})
} else {
reject(response.err);
}
});
});
};
所以我想要完成的是在resolve语句之前装饰数据。实际上,我想对其他API进行其他获取,并使用该响应中的数据来装饰我正在谈论的数据。我会写一些伪代码:
fetch (api1)
responseApi1 //{id: 123, name: 'Mike'}
fetch (api2)
responseApi2
responseApi1.description = responseApi2.description
responseApi1.address = responseApi2.address
return responseApi1 //responseApi1 decorated width responseApi2
//Controller
return res.json({ 'success': true, 'message': 'Item found successfully', 'item': responseApi1});
我根本不理解这些承诺,不能通过这个承诺制作这个承诺链并装饰一个对象并将其归还。
答案 0 :(得分:2)
回答你的“伪代码”示例(假设两个api都返回JSON)
return fetch (api1)
.then(res => res.json())
.then(responseApi1 => fetch(api2)
.then(res => res.json())
.then(({descritpion, address}) => ({...responseApi1, description, address}))
)
.then(result => {
//result is responseApi1 decorated width responseApi2
});
或者,如果api2不依赖于api1的结果(伪代码不清楚)
return Promise.all(fetch(api1).then(res => res.json()), fetch(api2).then(res => res.json()))
.then((responseApi1, {descritpion, address}) => ({...responseApi1, description, address}));
虽然,我不确定伪代码中的controller
部分是什么意思 - 没有任何意义,就像你完全没有它一样