Почему моя цепочка обещаний работает одновременно, а не последовательно - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в узлах и обещаниях, поэтому любая помощь будет принята!

Я пытаюсь:

  1. получить токен доступа из API
  2. отправить маркер доступа в тот же API для URL-адреса
  3. опросить URL-адрес для получения некоторых данных

Я думал, что разумным способом сделать это будет цепочка обещаний (Примечание Я еще не реализовал опрос, я просто пока что пытаюсь работать с console.log с интервалами. Также тела запросов не включены ниже, но не являются проблемой):

const request = require('request');

// get access token
new Promise((resolve, reject) => {
  request.post({
    json_request
  }, (error, response, body) => {
    if (error) console.error(error);
    console.log("got access token"));
    resolve(JSON.parse(body).accessToken);
  });
})

// use access token to get url
.then(
  (accessToken) => {
    request.post({
      json_request_with_access_token
    }, (error, response, body) => {
      if (error) console.error(error);
      console.log("got URL");
      return JSON.parse(body).url;
    })
  }
)

// Poll URL
.then(
  (reportURL) => {
    console.log("I'm here!");
    setInterval(() => {
     console.log("Report URL: ".concat(reportURL));
    }, 10000);    // setInterval waiting time
  }
)

Проблема в том, что последнее обещание в цепочке выполняется до того, как закончится среднее. Таким образом, вывод на консоль:

got access token
I'm here!
got URL
report URL: undefined

, если "Я здесь!" выводится перед «полученным URL», тогда во время выполнения второго обещания код должен перейти к последнему обещанию. Проблема в том, что у него еще нет URL. Я не понимаю, как запускать их один за другим, а не одновременно. Я попытался сделать три обещания в 3 отдельных функции, затем обернуть их в одну функцию asyn c main (), где

async function main() {
  let accessToken = await getAccessToken();
  let url = await getURL(accessToken);
  await pollReport(url);
}

, но в этом была та же ошибка. Кто-нибудь знает, как это исправить? Я где-то сделал ошибку basi c? Любая помощь приветствуется!

1 Ответ

0 голосов
/ 17 февраля 2020

Ваш раздел // use access token to get url и последний раздел не возвращают обещание. Это обратный вызов, который не возвращает обещание. вам нужно обернуть его в new Promise.

. Я бы настоятельно рекомендовал перейти с пакета request, так как теперь он устарел. Используйте некоторые пакеты Modenr Day, которые имеют встроенную поддержку для обещаний, а также сделают вашу жизнь проще. Как got, axios et c.

...