как отправить ответ только после завершения функции с помощью обещаний - PullRequest
0 голосов
/ 12 мая 2018

как отправить ответ только после выполнения определенной функции. Я пытался использовать обещания для этого, но это не похоже на работу.

let dealPromise = new Promise(function(resolve, reject){
for (let  i = 0;i < deals.length;i++) {
  let link = 'https://api.cortellis.com/api-ws/ws/rs/deals-v2/deal/' + deals[i] + '?fmt=json';
  let options = {
    method: 'GET',
    uri: link,
    auth: auth,
  };
  let constant = constants.collection('clarivate');

  request(options, function(error, response, body) {
    body = JSON.parse(body).dealRecordOutput;
    if (body.length === 0) {
      res.status(204).json({'data': []});
      next();
    }
    else {
      let type = body.Type;
      type_list.push(type);
      let status_val = body.Status;
      status_list.push(status_val);

      resp['type'] = type_list;
      resp['status'] = status_list;

       }
      });
    }
    resolve(resp);
  });

  dealPromise.then(function (result) {
    res.status(200).json({'data': result});
  });

Есть ли другой способ обойти это?

Ответы [ 2 ]

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

Если вы переключитесь в библиотеку request-promise для выполнения ваших запросов, то она будет возвращать обещание для каждого запроса, а затем вы можете использовать Promise.all(), чтобы узнать, когда они все будут выполнены.

Ваш коднемного неполный по ряду тем, например, что делать, когда вы сталкиваетесь с пустым телом и как именно вы хотите построить окончательные данные result.Итак, позволяя вам заполнить эти детали, вот общая структура, которая будет работать для вас:

const rp = require('request-promise');

let type_list = [], status_list = [];
Promise.all(deals.map(item => {
    let options = {
        method: 'GET',
        uri: 'https://api.cortellis.com/api-ws/ws/rs/deals-v2/deal/' + item + '?fmt=json',
        auth: auth
    };
    let constant = constants.collection('clarivate');
    return rp(options).then(body => {
        if (body.length !== 0) {
            try {
                let data = JSON.parse(body).dealRecordOutput;
                type_list.push(data.Type);
                status_list.push(data.Status)
            } catch(e) {
                // log and skip items with bad JSON
                console.log(e);
            }
        }
    });
})).then(() => {
    // all requests done here
    let result = {};
    // put code here to create result using type_list and status_list
    res.status(200).json({data: result});
}).catch(err => {
    // got an error in one of the requests
    console.log(err);
    res.sendStatus(500);
});
0 голосов
/ 12 мая 2018

Вы делаете несколько запросов, используя for, которые разрешаются даже после того, как ваше обещание выполнено.

Я бы сделал это:

const myPromises = Promise.all(deals.map(deal => {
    return new Promise((resolve, reject) => {
        // ... do your request here
        // call resolve in the callback request 
    })
}))

myPromises.then(result => {
    // ... here all your requests have been resolved
    // call res.status(200).json({...})
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...