首页 > 解决方案 > 如果失败 X 次,nodejs sendMessage 函数

问题描述

我希望我的函数执行 X(=3) 次直到成功。

我知道这个问题看起来与这个问题相似,但这些答案都没有帮助。

我只想将此消息发送到 slack,如果失败,请重试 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的新手。如果你们中的任何人可以在这里帮助我,那将非常有帮助。

标签: node.jspromisecallbackasync-awaitslack-api

解决方案


有一个使用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>


推荐阅读