node.js - nodejs sendMessage 函数如果失败 X 次

标签 node.js promise callback async-await slack-api

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

我知道这个问题看起来类似于 this question但这些答案都没有帮助。

我只想将此消息发送到 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次。 promise 无法正常运作 输出

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

我是nodejs新手。如果你们中的任何人能在这里帮助我,那将非常有帮助。

最佳答案

有一个使用 async/await 功能的解决方案,这将允许您在运行对异步函数的另一个调用之前等待 Promise 解析

成功示例:

//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>

关于node.js - nodejs sendMessage 函数如果失败 X 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56922490/

相关文章:

javascript - 在 Mongoose 路由中使用 Promise

Javascript promise 意外的执行流程

flutter - 如何在 Flutter 中传递回调

javascript - 为什么回调函数中 "this"指向 "window Object"呢?

javascript - Passport.js 注册似乎有效,但用户凭据未插入数据库

node.js - 云函数 : Resized images not loading

node.js - 多对多关系的正确文件夹结构

SqlAnywhere 的 Node.js 驱动程序 - 超出准备语句

c++ - 将 std::future 传递给 boost::thread 与 std::thread

javascript - 如果错误是可重试的,则重试异步函数