Цепочка обещает и украшает предмет - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь понять обещания, мне нужно объединить их в цепочку и украсить данные ширины объекта с разных конечных точек.

Например:

У меня есть это в моем приложении для экспресс-обработки узлов

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

Итак, я хочу украсить данные перед оператором разрешения.Действительно, я хочу сделать другую выборку для другого 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});

Я вообще не понимаю обещаний, не могу выполнить эту цепочку обещаний и украсить только один объект через эти обещания и вернуть его.

1 Ответ

0 голосов
/ 30 мая 2018

Чтобы ответить на ваш пример с "псевдокодом" (при условии, что оба 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 в псевдокоде - не имеет никакого смысла, как будто он у вас вообще есть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...