¿Cómo puede volver a intentar después de una excepción en Javascript cuando usa promesas?

Estoy usando la biblioteca de promesas Bluebird. Tengo una cadena de funciones prometidas como las siguientes:

    receiveMessageAsync(params)
    .then(function(data)) {
        return [data, handleMessageAsync(request)];
    })
    .spread(function(data, response) {
        return [response, deleteMessageAsync(request)];
    })
    .spread(function(response, data) {
        return sendResponseAsync(response);
    })
    .then(function(data) {
        return waitForMessage(data);
    })
    .catch (function(err) {
       // handle error here
    });

Ocasionalmente, sendMessage fallará porque, digamos, el servidor al que responder no está disponible. Quiero que el código siga intentando responder para siempre hasta que tenga éxito. No puede simplemente envolver el sendMessage en una captura porque en realidad no arroja una excepción, supongo, llama a la función "error" que, en este código prometido, es la "captura" en la parte inferior. Por lo tanto, debe haber alguna forma de "volver a intentar" enviar el mensaje en la sección "captura". El problema es que incluso si reintento en un bucle en la "captura", todavía no tengo forma de saltar a la cadena de promesa y ejecutar las funciones prometidas restantes. ¿Cómo trato con esto?

EDITAR:

Mi reintento para una publicación HTTP terminó así:

function retry(func) {
    return func()
        .spread(function(httpResponse) {
            if (httpResponse.statusCode != 200) {
                Log.error("HTTP post returned error status: "+httpResponse.statusCode);
                Sleep.sleep(5);
                return retry(func);
            }
        })
        .catch(function(err) {
            Log.err("Unable to send response via HTTP");
            Sleep.sleep(5);
            return retry(func);
        });
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta