Я так и не понял: если некоторое сообщение отправилось неудачно (например, интернет сбойнул или ошибка на сервере), то что делать? Пытаться снова отправить с тем же номером? Или забить на него, а тот-же номер использовать для следующего сообщения?
Если второе, то вот набросок с промисами. Я рекомендую стандартные промисы вместо всяких дефередов.
var promise = Promise.resolve(startMsgId);
function send(msg) {
var oldId;
promise = promise.then(function (id) {
return sendToServer(oldId = id, msg);
}).catch(function (err) {
return oldId;
});
}
Предполагается, что sendToServer возвращает промис, который зарезолвится новым id. А если зареджектится, то возвращаем oldId - тот, каторый использовали для запроса.