Как можно повторить попытку после исключения в Javascript при использовании обещаний?

Я использую библиотеку обещаний Bluebird. У меня есть цепочка обещанных функций, таких как следующие:

    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
    });

Иногда sendMessage не работает, потому что, скажем, сервер, на который нужно ответить, недоступен. Я хочу, чтобы код продолжал пытаться отвечать вечно, пока это не удастся. Вы не можете просто обернуть sendMessage в catch, потому что он на самом деле не выдает исключение, я полагаю, он вызывает функцию «error», которая в этом обещанном коде является «catch» внизу. Таким образом, должен быть какой-то способ «повторить» отправку сообщения в разделе «catch». Проблема в том, что даже если я повторяю цикл в «catch», у меня все равно нет возможности перейти к цепочке обещаний и выполнить оставшиеся обещанные функции. Как мне с этим бороться?

РЕДАКТИРОВАТЬ:

Моя повторная попытка получить сообщение HTTP выглядела так:

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);
        });
}

Ответы на вопрос(3)

Ваш ответ на вопрос