2017-03-24 15 views
0

Ich habe folgenden Code, der eine Warteschlange verarbeiten und ich muss die Funktion existieren, wenn keine Nachrichten in der Warteschlange sind und es nicht genug Zeit gibt, weitere Nachrichten zu verarbeiten. Mein Problem ist, dass es beim Versagen der Bedingung nicht aus der Funktion springt und ich denke, dass dies eine rekursive Funktion ist, aber ich kann es nicht herausfinden.Javascript Funktion beendet nicht die Funktion wehn die Bedingung fehlgeschlagen

/** 
* Check if there is enough time to process more messages 
* 
* @param {} context 
* @returns {boolean} 
*/ 
async function enoughTimeToProcess(context) { 
    return context.getRemainingTimeInMillis() > 230000; 
} 

/** 
* Consume the queue and increment usages 
* 
* @param context 
* 
* @returns {boolean} 
*/ 
async function process(context) { 
    const messagesPerRequest = queueConst.messagesPerRequest; 
    const messagesToBeDeleted = []; 

    const queue = new queueClient(); 

    const messages = await queue.getMessages(messagesPerRequest); 

    if (messages === undefined) { 
    if (await enoughTimeToProcess(context) === true) { 
     await process(context); 
    } else { 
     return false; 
    } 
    } 

    const responses = messages.map(async(messageItem) => { 
    const messageBody = JSON.parse(messageItem.Body); 
    const parsedMessage = JSON.parse(messageBody.Message); 

    const accountId = parsedMessage[0].context.accountId; 
    let code = parsedMessage[0].context.code; 

    // Our DB support only lowercase characters in the path 
    code = code.toLowerCase(); 

    const service = parsedMessage[0].name; 
    const count = parsedMessage[0].increment; 

    const storageResponse = await incrementUsage(
     { storageClient: storage, code, accountId, service, count } 
    ); 

    if (storageResponse) { 
     messagesToBeDeleted.push({ 
     Id: messageItem.MessageId, 
     ReceiptHandle: messageItem.ReceiptHandle, 
     }); 
    } 

    return 1; 
    }); 

    const processedMessages = await Promise.all(responses); 
    const processedMessagesCount = processedMessages.length; 

    if (messagesToBeDeleted.length > 0) { 
    console.log(`${processedMessagesCount} messages processed.`); 
    await queue.deleteMessageBatch(messagesToBeDeleted); 
    } 

    if (await enoughTimeToProcess(context) === true) { 
    await process(context); 
    } 

    return true; 
} 
+0

Warum ist 'genugTimeToProcess' async? warum würdest du es "erwarten", da ist nichts asynchron! –

+0

Sonst wird es nicht warten, bis ich das Ergebnis von 'genugTimeToProcess' – Shaolin

+0

bekomme, aber ... es gibt nichts asynchron in dieser Funktion ... gibt es? Wenn ja, wartest du in dieser Funktion sowieso nicht auf diese Funktion –

Antwort

0

Ich denke, das Problem sein kann, wenn Nachrichten nicht definiert sind, und es gibt immer noch genug Zeit, weil die rekursive Funktion unendlich oft genannt werden wird, weil es immer beiden Bedingungen erfüllt, und wahrscheinlich übersteigt es die zur Verfügung stehenden Ressourcen . Versuchen Sie, einige Zeit zu schlafen, bevor Sie die Prozessfunktion erneut aufrufen, nur um sicher zu sein, dass es das Problem ist

+0

'die rekursive Funktion wird unendlich oft genannt werden '- nicht wahrscheinlich - mit all diesen' erwarten's drin –

+0

susoPisto Es ist nicht. Es stoppt, wenn nicht genug Zeit ist. Mein Problem ist, dass es nicht aus der Funktion herausspringt, auch wenn es "else" Aussage erreicht. – Shaolin

Verwandte Themen