Функция nodeMs sendMessage, если не удалось X раз - PullRequest
1 голос
/ 07 июля 2019

Я хочу, чтобы моя функция выполнялась X (= 3) раза до успеха.

Я знаю, этот вопрос похож на этот вопрос , но ни один из ответов не помог.

Я просто хочу отправить это сообщение, чтобы ослабить, и если это не удается, попробуйте еще раз 3 раза.

const options = {
    'text': 'Hello'
  }

let flag = 0
  function sendMessage () {
    const promise = new Promise((resolve, reject) => {
      axios.post(webhookURL, JSON.stringify(options))
        .then(response => {
          flag++
          return resolve('SUCCESS: Sent slack webhook', response.data)
        })
        .catch(error => {
          return reject(new Error('FAILED: Sent slack webhook', error))
        })
    })
    return promise
  }

  for (let maxRetry = 0; maxRetry < 3; maxRetry++) {
    const p = sendMessage()
    p
      .then((status) => {
        console.log(status)
      })
      .catch((err) => {
        console.log(err)
      })
    console.log('flag', flag)
    if (flag >= 1) {
      break
    }
  }

Оно запускается 3 раза, даже если оно прошло успешно.Обещание не работает должным образом:

flag 0
flag 0
flag 0
SUCCESS: Sent slack webhook
SUCCESS: Sent slack webhook
SUCCESS: Sent slack webhook

Я новичок в nodejs.Будет очень полезно, если кто-нибудь из вас сможет мне здесь помочь.

1 Ответ

2 голосов
/ 08 июля 2019

Существует решение, использующее функцию async/await, и это позволит вам дождаться разрешения обещания, прежде чем запускать другой вызов асинхронной функции

Пример с успехом:

//const axios = require('axios');

function sendMessage() {
  return new Promise((resolve, reject) => {
    axios
      .get('https://jsonplaceholder.typicode.com/posts/1')
      .then(response => {
        resolve('SUCCESS: Sent slack webhook', response.data);
      })
      .catch(error => {
        reject(new Error('FAILED: Sent slack webhook', error));
      });
  });
}

(async function loop() {
  for (let i = 0; i < 3; i++) {
    console.log('loop count = ', i);
    try {
      const res = await sendMessage();
      console.log(res);
      break;
    } catch (error) {
      console.log(error);
    }
  }
})();
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

Пример с ошибкой:

//const axios = require('axios');

function sendMessage() {
  return new Promise((resolve, reject) => {
    axios
      .get('https://falseurl')
      .then(response => {
        resolve('SUCCESS: Sent slack webhook', response.data);
      })
      .catch(err => {
        console.log('FAILED: Sent slack webhook')
        reject(new Error('FAILED: Sent slack webhook', err));
      });
  });
}

(async function loop() {
  for (let i = 0; i < 3; i++) {
    console.log('loop count = ', i);
    try {
      const res = await sendMessage();
      console.log(res);
      break;
    } catch (err) {
      console.log(err);
    }
  }
})();
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
...