Javascript 如何保持循环运行并发送所有消息?
我正在尝试发送1000多条消息。问题发生在twilio捕获中:当错误返回时,循环中断,不再继续前进。如何保持循环运行,从而确保发送所有消息Javascript 如何保持循环运行并发送所有消息?,javascript,Javascript,我正在尝试发送1000多条消息。问题发生在twilio捕获中:当错误返回时,循环中断,不再继续前进。如何保持循环运行,从而确保发送所有消息 try { const targets: TargetSms[] = data.targets; const rbd = data.rbd; const idMessage = data.idMessage; const messageRef = admin.firestore().coll
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 })
}
使用
continue
语句在循环中出现错误后“继续”处理项目
您需要稍微重新格式化代码,例如:
for(目标的常量目标){
if(target.messagePayload)返回目标;
常量文本消息={
正文:target.plainMsg,
至:target.targetNumber,//文本至此号码
from:TwilionNumber,//来自有效的Twilio编号
};
让payloadMessage;
试一试{
payloadMessage=wait client.messages.create(textMessage);
}捕捉(错误){
控制台警告('ocurrio un error al envirar mensaje',err)
target.messageError=err;
//continue;//删除此行以继续执行finally块
}最后{
如果(payloadMessage){
countSeg=countSeg+parseInt(payloadMessage.numSegments);
target.messagePayload=JSON.parse(JSON.stringify(newmessagepayload(payloadMessage)));
}
等待admin.firestore().collection(`/targets`).doc(target.id).set(target);
等待超时(100);
}
};
通过这种方式,您可以摆脱“旧”的then
语法,因为async-await
允许您将await
代码放在try-catch
块中,以拦截await
调用中的错误,如果成功,将执行之后的所有操作
还可以使用continue
来代替返回null
也许您可以去掉条件块if(payloadMessage)
,因为try-catch
确保变量有一个值,但idk是肯定的
此处的规格:这是错误的,您不能在catch arrow函数内继续for循环,因为for循环超出catch处理程序的范围。例如,
for(让i=0;i<100;i++)(()=>continue)()
将抛出一个SyntaxError
@junvar,正好在日期内,同一个编辑器通知我该错误client.messages.create(textMessage)
与client.messages.create(textMessage)相同。然后(res=>res)
,这能保证消息的有效负载返回吗,使用client.messages.create(textMessage).then(res=>res)
时,client.messages.create(textMessage)
的返回值是then
中的res
变量。但是,wait
允许您直接将值分配给变量,这就是为什么then(res=>res)
不相关的原因。当它捕获错误时,缓存不会继续下面的行,它会跳到循环的下一个索引,countSeg=countSeg+parseInt(target.messagePayload.numSegments)
如果错误为yes,则它不会运行;如果wait
调用引发错误,则catch会停止执行。如果您需要代码在捕获后继续执行,您可以在捕获后添加finally块,回答编辑…您也可以简单地注释continue
,在这种情况下,您不需要finally块。