Node.js и Express: дождитесь асинхронной операции, прежде чем отвечать на HTTP-запрос - PullRequest
0 голосов
/ 13 мая 2019

Скажем, есть обратный вызов HTTP GET, определенный как:

router.get('/latestpost', function(req, res, next) {

    var data = new FbData();
    get_latest_post (data);
    get_post_image (data);

    res.json(data);
};

Обе функции get_ используют пакет fb для генерации HTTP-запроса и выполнения обратного вызова после завершения. Как изменить вышеупомянутый обратный вызов GET, чтобы ждать ответов от Facebook и только затем отправлять ответ клиенту?

В настоящее время я решил проблему, выполнив последовательно функции get_ и передав им аргумент res (response), а последняя функция отправила ответ:

router.get('/latestpost', function(req, res, next) {
    var data = new FbData();
    get_latest_post (res, data);
};


function get_latest_post (res, data) {

    FB.api(_url, function (res_fb) {

        if(!res_fb || res_fb.error) {
            console.log(!res_fb ? 'error occurred' : res_fb.error);
            return;
        }

        // Do stuff with data

        get_post_image (res, data);
    });
}


function get_post_image (res, data) {

    FB.api(_url, function (res_fb) {

        if(!res_fb || res_fb.error) {
            console.log(!res_fb ? 'error occurred' : res_fb.error);
            return;
        }

        // Do stuff with data

        /* At the end send the post data to the client */
        res.json(data);
    });
}

Я нашел аналогичный вопрос , но я обнимаю его, так как не могу найти правильный способ применить решение к моей проблеме. Я пытался использовать шаблоны, описанные в этом руководстве , но я не могу заставить его работать, используя обещания или async / await. Может кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 13 мая 2019

Ваш API может быть легко изменен, чтобы вернуть обещание:

 function get_post_image (res, data) {
   return new Promise((resolve, reject) => {
    FB.api(_url, function (res_fb) {
      if(!res_fb || res_fb.error) {
        reject(res_fb && res_fb.error);
      } else resolve(res_fb/*?*/);
   });
 }

Теперь, когда у вас есть обещание, вы можете его дождаться:

 router.get('/latestpost', async function(req, res, next) {
   const data = new FbData();
   const image = await get_post_image (data);

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