123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /**
- * A long-running task, which periodically pings the server for its task status
- */
- define(
- function( require ) {
- "use strict";
- var Marionette = require( "marionette" ),
- Backbone = require( "backbone" ),
- _ = require( "underscore" ),
- fui = require( "app/fui" ),
- sprintf = require( "sprintf" );
- /* Constants */
- var MS = 1000;
- var MAX_DELAY = 10 * MS;
- /**
- * This model represents a long running task process
- */
- var Task = function( ds, operationType, taskDescription ) {
- this.taskDescription = taskDescription;
- this.ds = ds;
- this.operationType = operationType;
- this.delay = 500;
- _.bindAll( this, "checkTaskStatus", "onCurrentTaskStatusFail", "onCurrentTaskStatus" );
- this.checkTaskStatus();
- };
- _.extend( Task.prototype, {
- /** Return the unique ID (on this server) of the task */
- taskId: function() {
- return this.taskDescription.taskId;
- },
- /** Return the URL for the task's API */
- taskURL: function() {
- return sprintf( "%s/$/tasks/%s", this.ds.baseURL(), this.taskId() );
- },
- /** Test the current status of the task */
- checkTaskStatus: function() {
- $.getJSON( this.taskURL() )
- .done( this.onCurrentTaskStatus )
- .fail( this.onCurrentTaskStatusFail )
- },
- /** Successful result from checking the task */
- onCurrentTaskStatus: function( taskDescription ) {
- this.taskDescription = taskDescription;
- var status = {
- task: this,
- dsId: this.ds.name(),
- finished: this.taskFinished()
- };
- fui.vent.trigger( "task.status", status );
- this.queueTaskStatusCheck();
- },
- /** Failed to check the task */
- onCurrentTaskStatusFail: function( jqxhr, msg, err ) {
- var status = {
- task: this,
- dsId: this.ds.name(),
- errorMessage: err || msg
- };
- fui.vent.trigger( "task.failed", status );
- },
- /** Re-queue the status check if the task is not yet complete */
- queueTaskStatusCheck: function() {
- if (!this.taskFinished()) {
- _.delay( this.checkTaskStatus, this.statusDelay() );
- }
- },
- /** Return the completion time if the task has been fid, otherwise null */
- taskFinished: function() {
- return this.taskDescription.finished;
- },
- /** Return the delay in ms until the next status check is due. */
- statusDelay: function() {
- var t = this.delay;
- if (t < MAX_DELAY) {
- this.delay = t * 2;
- }
- return t;
- }
- } );
- return Task;
- }
- );
|