node.js - 如果失败 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的新手。如果你们中的任何人可以在这里帮助我,那将非常有帮助。
解决方案
有一个使用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>
推荐阅读
- jquery - 我可以对多个 Ajax 调用使用相同的类名吗
- pandas - 如何在pyspark中使用udf比较一对列?
- python - 我无法制作键内有 # 符号的字典
- python - 将两个日期之间的差转换为整数
- python - 在给定距离内获取邻居 BFS 算法
- python - Client = discord.client() TypeError: 'module' object is not callable
- stata - 在 coefplot 中分配不同的标签
- php - 使用 OOP PHP 的 Ajax 请求
- java - 如何撤消任何功能
- javafx - 如何获取用户点击java fx的x和y