Javascript 如何保持循环运行并发送所有消息?

Javascript 如何保持循环运行并发送所有消息?,javascript,Javascript,我正在尝试发送1000多条消息。问题发生在twilio捕获中:当错误返回时,循环中断,不再继续前进。如何保持循环运行,从而确保发送所有消息 try { const targets: TargetSms[] = data.targets; const rbd = data.rbd; const idMessage = data.idMessage; const messageRef = admin.firestore().coll

我正在尝试发送1000多条消息。问题发生在twilio捕获中:当错误返回时,循环中断,不再继续前进。如何保持循环运行,从而确保发送所有消息

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块。