【问题标题】:nodejs sendMessage function if failed X times如果失败 X 次,nodejs sendMessage 函数
【发布时间】:2019-11-17 05:38:27
【问题描述】:

我希望我的函数执行 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次。承诺无法正常工作 输出

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

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

【问题讨论】:

  • 我更新了问题。请再看一遍。我被困在这里。如果失败,则失败 3 次,如果运行,则运行 3 次。第一次成功后它不会停止。
  • 问题是循环在标志甚至更新一次之前就完成了,因为它是异步执行,这就是为什么你把所有标志都设为 0 .... 所以标准循环不会工作在这个例子中
  • 那么我应该怎么做才能正确运行它。我怎样才能使它同步。您能否写一个答案以使其正常工作。
  • 在我的回答中查看解决方案

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


【解决方案1】:

有一个使用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);
    }
  }
})();
&lt;script src="https://unpkg.com/axios/dist/axios.min.js"&gt;&lt;/script&gt;

错误示例:

//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);
    }
  }
})();
&lt;script src="https://unpkg.com/axios/dist/axios.min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多