Summary
Tasks represent individual changes to the datastore that alter the local cache and need to be synced back to the server.
To create a new task, subclass Task and implement the following methods:
- performLocal: Return a Promise that does work immediately. Must resolve or the task will be thrown out. Generally, you should optimistically update the local cache here.
- performRemote:
Do work that requires dependencies to have resolved and may need to be
tried multiple times to succeed in case of network issues.
performRemote must return a Promise, and it should always resolve with
Task.Status.FinishedorTask.Status.Retry. Rejections are considered exception cases and are logged to our server. ReturningTask.Status.Retrywill cause theTaskQueueto leave your task on the queue and run it again later. You should only returnTask.Status.Retryif your task encountered a transient error (for example, a0but not a400). - shouldWaitForTask:
Tasks may be arbitrarily dependent on other tasks. To ensure that
performRemoteis called at the right time, subclasses should implementshouldWaitForTask(other). For example, theSendDrafttask is dependent on the draft's files'UploadFiletasks completing.
Tasks may also implement shouldDequeueOtherTask(other). Returning true
will cause the other event to be removed from the queue. This is useful in
offline mode especially, when the user might Save,Save,Save,Save,Send.
Each newly queued Save can cancel the (unstarted) save task in the queue.
Tasks that need to support undo/redo should implement canBeUndone, isUndo,
createUndoTask, and createIdenticalTask.