Выполнение второго вызова API после первого вызова API возвращает данные - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть две отдельные функции, которые выполняют вызовы API для разных конечных точек для возврата данных JSON с использованием BlueBirdPromise.

 const searchVenues = (type) => {
  logger.debug('getVenues : type = ' + type);

  const config = {
    url: urlAPIServer + '/venue/available',
    qs: {
      type,
    },
    headers: {
      'x-api-key': dataApiKey
    }
  };

  return new BluebirdPromise((resolve, reject) => {
    request.get(config, (err, response, body) => {
      if (err) {
        console.error(err);
        reject(err);
      } else {
        resolve(JSON.parse(body));
      }
    });
  });
};

const getVenuesWithCuisine = () => {
  logger.debug('getVenuesWithCuisine');

  const config = {
    url: urlAPIServer + '/venue/viewvenuewithcuisine',
    headers: {
      'x-api-key': dataApiKey
    }
  };

  return new BluebirdPromise((resolve, reject) => {
    request.get(config, (err, response, body) => {
      if (err) {
        console.error(err);
        reject(err);
      } else {
        resolve(JSON.parse(body));
      }
    });
  });
};

Отдельный вызов функций для получения данных из API и их привязки к переменной.

searchVenues(venueType).then((venues) => {
      checkContextTimeout(context);
      conversationContext.venueType = venueType;
      conversationContext.venues = venues;
      context.skill = conversationContext; 
    });

    getVenuesWithCuisine().then((venueswithcuisines) => {
      conversationContext.venue_details = venueswithcuisines[0}["venue_details"];
      conversationContext.cuisines = venueswithcuisines[1]["cuisines"];
      conversationContext.venueType = venueType;
      conversationContext.venues = venuesJson.venues;
      continueConversation(request, response, context);
    });

Проблема с вышеприведенной реализацией заключается в том, что если по какой-то причине getVenuesWithCuisine завершается первым доsearchVenues, продолжение continueConversation вызывает conversationContext.venues = venues как ноль.

Как я могу сделать эти вызовы API синхронными, чтобы второй вызов API выполнялся только после того, как первый вернет данные.

1 Ответ

0 голосов
/ 27 сентября 2018

Вы можете использовать Promise.all вместо того, чтобы делать это синхронно.Это разрешится, как только оба ваших обещания разрешатся и дадут вам результаты.http://bluebirdjs.com/docs/api/promise.all.html

Promise.all([searchVenues(venueType), getVenuesWithCuisine()]).then(function([venueResp, cuisineResp]) {
  ...
});
...