javascript - 如何保持循环运行并发送所有消息?
问题描述
我正在尝试发送超过 1000 条消息。问题发生在 twilio catch 中:当错误返回时,循环中断并且不会继续前进。如何保持循环运行,从而确保发送所有消息?
try {
const targets: TargetSms[] = data.targets;
const rbd = data.rbd;
const idMessage = data.idMessage;
const messageRef = admin.firestore().collection(`/RBD/${rbd}/messages`).doc(idMessage);
await messageRef.set({ serverResponse: true }, { merge: true });
let countSeg = 0;
for (const target of targets) {
if (target.messagePayload) return target;
const textMessage = {
body: target.plainMsg,
to: target.targetNumber, // Text to this number
from: twilioNumber, // From a valid Twilio number
};
const payloadMessage = await client.messages
.create(textMessage)
.then(mess => mess)
.catch(err => {
console.warn('ocurrio un error al enviar mensaje', err)
target.messageError = err;
return null;
});
if(payloadMessage){
countSeg = countSeg + parseInt(payloadMessage.numSegments);
target.messagePayload = JSON.parse(JSON.stringify(new MessagePayload(payloadMessage)));
}
await admin.firestore().collection(`/RBD/${rbd}/targets`).doc(target.id).set(target);
await timeout(100);
};
await messageRef.set({totalSegments:countSeg},{merge:true});
await admin.firestore().doc(`/RBD/${rbd}`).set({config: {"countSms": admin.firestore.FieldValue.increment(countSeg)}},{merge:true});
return JSON.stringify({ suss: true, message: 'Mensajes enviados' })
} catch (error) {
return JSON.stringify({ suss: false, message: error })
}
解决方案
您需要稍微重新格式化您的代码,例如:
for (const target of targets) {
if (target.messagePayload) return target;
const textMessage = {
body: target.plainMsg,
to: target.targetNumber, // Text to this number
from: twilioNumber, // From a valid Twilio number
};
let payloadMessage;
try {
payloadMessage = await client.messages.create(textMessage);
} catch (err) {
console.warn('ocurrio un error al enviar mensaje', err)
target.messageError = err;
// continue; // Remove this line to continue the execution of finally block
} finally {
if (payloadMessage) {
countSeg = countSeg + parseInt(payloadMessage.numSegments);
target.messagePayload = JSON.parse(JSON.stringify(new MessagePayload(payloadMessage)));
}
await admin.firestore().collection(`/targets`).doc(target.id).set(target);
await timeout(100);
}
};
通过这种方式,您可以摆脱“旧”then
语法,因为async - await
您可以将await
代码放在一个try - catch
块中以拦截await
调用中的错误,并且在成功的情况下执行其他所有操作。
也可以用continue
to 代替return null
.
也许你可以摆脱条件块if (payloadMessage)
,因为try - catch
确保你的变量有一个值,但肯定是 idk。
这里的规格:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
推荐阅读
- apache-nifi - Nifi 1.8 csv 数据库摄取
- docker - 在 docker 中构建:/go/bin 中的意外二进制文件
- cygwin - *** 致命错误 - 加载共享库时出错:C:无法打开共享对象文件:没有这样的文件或目录
- comparison - 在 ADT 上如何定义多态比较?
- iis - 如何授予 IIS 进程读取网络位置的权限?
- apache-kafka - 如果 Kafka 丢失分区同步会发生什么
- java - 使用 Mockito 对 Spring Boot 控制器进行单元测试
- r - 无法将用户输入传递到 R 闪亮模块
- vue.js - Vue-jest 找不到 babel
- python - 从模型创建 graphene-django 接口