JSFiddle - React, Tailwind, and code Playground

JavaScript

/* Pseudo-code */

var tasksByTimeoutIds = {};

task.change(function() {
    var self = this;
    if (self.timeoutId) 
        clearTaskTimeout(self.timeoutId);
    self.timeoutId = setTimeout(function() {
        saveTask(self);
    }, 5000);
    taskIdByTimeoutIds[self.timeoutId] = self;
    notifyListenersOfTaskChange();
});

function clearTaskTimeout(timeoutId){
    clearTimeout(timeoutId);
    delete tasksByTimeoutIds[timeoutId];
}

function saveAllTasks() {
    for (var timeoutId in taskIdByTimeoutIds) {
        clearTaskTimeout(timeoutId);
        saveTask(tasksByTimeoutIds[timeoutId]);
    }
}

task.blur = saveAllTasks;
window.onbeforeunload = saveAllTasks;