首页 > 解决方案 > 如何保持循环运行并发送所有消息?

问题描述

我正在尝试发送超过 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 })
    }

标签: javascript

解决方案


您需要稍微重新格式化您的代码,例如:

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调用中的错误,并且在成功的情况下执行其他所有操作。

也可以用continueto 代替return null.

也许你可以摆脱条件块if (payloadMessage),因为try - catch确保你的变量有一个值,但肯定是 idk。

这里的规格:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function


推荐阅读