Javascript 链承诺和装饰一个对象

Javascript 链承诺和装饰一个对象,javascript,node.js,express,promise,fetch-api,Javascript,Node.js,Express,Promise,Fetch Api,我试图理解承诺,我需要将它们链接起来,并装饰来自不同端点的对象宽度数据 例如: 我的node express应用程序中有此功能 //controller.js export const getItem = (req, res) => { ItemService.getItem(req.params.id).then(function(item) { return res.json({ 'success': true, 'message': 'Item found s

我试图理解承诺,我需要将它们链接起来,并装饰来自不同端点的对象宽度数据

例如:

我的node express应用程序中有此功能

//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});
我一点也不理解这些承诺,不能通过这些承诺来构建一个对象,并返回它。

回答您的“伪代码”示例(假设两个api都返回JSON)

或者,如果api2不依赖于api1的结果(这在伪代码中不清楚)

尽管如此,我不确定伪代码中的
控制器
部分是什么意思——似乎你根本不需要回答你的“伪代码”示例(假设两个api都返回JSON)

或者,如果api2不依赖于api1的结果(这在伪代码中不清楚)


尽管如此,我不确定伪代码中的
控制器
部分是什么意思-就像您拥有它一样毫无意义

两个脚本都在导出一个名为
getItem
的函数,此外,还有一个对象
apirls
,其属性函数为
getItem
?你可以考虑更别具一格地命名函数,否则很容易混淆你自己的代码<代码>获取代码>代码已经是一个承诺,不要做<代码>返回新的承诺<代码>,只做<代码>返回获取(< /代码>然后做->代码>如果(响应)返回响应。jSOR()如果ApI2不依赖于API1,我建议使用。两个脚本都导出了一个名为“代码> GTETEM < /代码>的函数,此外,还有一个对象<代码> Apururs<代码>,它具有“代码> GTETEM < /代码>的属性函数。您可以更独特地考虑命名函数,否则它将非常容易协作。nfuse yourself
fetch
已经是一个承诺,不要执行
返回新承诺
,只需执行
返回fetch(
&然后执行->
if(response)返回response.json();else throw response.errr;
如果api2不依赖于api1,我建议使用。正如你所说,api2不依赖于api1的结果。我只需要调用一组API,并从这些响应中生成对象宽度信息。所以使用promise all方法就像你说的,api2不依赖于api1的结果。我只需要调用一组API并根据这些响应生成对象宽度信息。因此使用promise all方法
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
    });
return Promise.all(fetch(api1).then(res => res.json()), fetch(api2).then(res => res.json()))
    .then((responseApi1, {descritpion, address}) => ({...responseApi1, description, address}));