Changeset 548

Show
Ignore:
Timestamp:
01/22/06 05:31:35 (3 years ago)
Author:
therve@gmail.com
Message:

DeferredList?

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • mochikit/branches/scriptaculous/MochiKit/Async.js

    r487 r548  
    355355    } 
    356356}; 
     357 
     358MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) { 
     359    this.list = list; 
     360    this.resultList = new Array(this.list.length); 
     361 
     362    // Deferred init 
     363    this.chain = []; 
     364    this.id = this._nextId(); 
     365    this.fired = -1; 
     366    this.paused = 0; 
     367    this.results = [null, null]; 
     368    this.canceller = canceller; 
     369    this.silentlyCancelled = false; 
     370     
     371    if (this.list.length == 0 && !fireOnOneCallback) { 
     372        this.callback(this.resultList); 
     373    } 
     374     
     375    this.finishedCount = 0 
     376    this.fireOnOneCallback = fireOnOneCallback; 
     377    this.fireOnOneErrback = fireOnOneErrback; 
     378    this.consumeErrors = consumeErrors; 
     379 
     380    var index = 0; 
     381    MochiKit.Base.map(MochiKit.Base.bind(function (d) { 
     382        d.addCallback(MochiKit.Base.bind(this._cbDeferred, this), index, true); 
     383        d.addErrback(MochiKit.Base.bind(this._cbDeferred, this), index, false); 
     384        index += 1; 
     385    }, this), this.list); 
     386}; 
     387 
     388MochiKit.Base.update(MochiKit.Async.DeferredList.prototype, 
     389                     MochiKit.Async.Deferred.prototype); 
     390 
     391MochiKit.Base.update(MochiKit.Async.DeferredList.prototype, { 
     392    _cbDeferred: function (index, succeeded, result) { 
     393        this.resultList[index] = [succeeded, result]; 
     394        this.finishedCount += 1; 
     395        if (this.fired != 0) { 
     396            if (succeeded && this.fireOnOneCallback) { 
     397                this.callback([index, result]); 
     398            } else if (!succeeded && this.fireOnOneErrback) { 
     399                this.errback(result); 
     400            } else if (this.finishedCount == this.list.length) { 
     401                this.callback(this.resultList); 
     402            } 
     403        } 
     404        if (!succeeded && this.consumeErrors) { 
     405            result = null; 
     406        } 
     407        return result; 
     408    } 
     409}); 
    357410 
    358411MochiKit.Base.update(MochiKit.Async, { 
     
    621674    "XMLHttpRequestError", 
    622675    "Deferred", 
     676    "DeferredList", 
    623677    "succeed", 
    624678    "fail", 
  • mochikit/branches/scriptaculous/tests/test_MochiKit-Async.html

    r399 r548  
    1313         
    1414    // Counting the number of tests is really lame 
    15     plan({'tests': 35}); 
     15    plan({'tests': 39}); 
    1616 
    1717    var increment = function (res) { 
     
    163163        ok(e instanceof AlreadyCalledError, "non-swallowed cancel"); 
    164164    } 
     165 
     166    /* 
     167        Test DeferredList 
     168    */ 
     169     
     170    var callList = new Array(3); 
     171    callList[0] = new Deferred(); 
     172    callList[1] = new Deferred(); 
     173    callList[2] = new Deferred(); 
     174    callList[0].addCallback(increment); 
     175    callList[1].addCallback(increment); 
     176    callList[2].addCallback(increment); 
     177    var defList = new DeferredList(callList); 
     178    callList[0].callback(3); 
     179    callList[1].callback(5); 
     180    callList[2].callback(4); 
     181     
     182    defList.addCallback(function (lst) { 
     183        is( arrayEqual(lst, [[true, 4], [true, 6], [true, 5]]), 1, 
     184           "deferredlist result ok" ); 
     185    }); 
     186    
     187    /* 
     188        Test fireOnOneCallback 
     189    */ 
     190    
     191    var callList2 = new Array(3); 
     192    callList2[0] = new Deferred(); 
     193    callList2[1] = new Deferred(); 
     194    callList2[2] = new Deferred(); 
     195    callList2[0].addCallback(increment); 
     196    callList2[1].addCallback(increment); 
     197    callList2[2].addCallback(increment); 
     198    var defList2 = new DeferredList(callList2, true); 
     199    callList2[1].callback(5); 
     200    callList2[0].callback(3); 
     201    callList2[2].callback(4); 
     202     
     203    defList2.addCallback(function (lst) { 
     204        is( arrayEqual(lst, [1, 6]), 1, "deferredlist fireOnOneCallback ok" ); 
     205    }); 
     206 
     207    /* 
     208        Test fireOnOneErrback 
     209    */ 
     210 
     211    var callList3 = new Array(3); 
     212    callList3[0] = new Deferred(); 
     213    callList3[1] = new Deferred(); 
     214    callList3[2] = new Deferred(); 
     215    callList3[0].addCallback(increment); 
     216    callList3[1].addCallback(throwStuff); 
     217    callList3[2].addCallback(increment); 
     218    var defList3 = new DeferredList(callList3, false, true); 
     219    callList3[0].callback(3); 
     220    callList3[1].callback("foo"); 
     221    callList3[2].callback(4); 
     222     
     223    defList3.addErrback(function (err) { 
     224        is( err.message, "foo", "deferredlist fireOnOneErrback ok" ); 
     225    }); 
     226 
     227    /* 
     228        Test consumeErrors 
     229    */ 
     230 
     231    var callList4 = new Array(3); 
     232    callList4[0] = new Deferred(); 
     233    callList4[1] = new Deferred(); 
     234    callList4[2] = new Deferred(); 
     235    callList4[0].addCallback(increment); 
     236    callList4[1].addCallback(throwStuff); 
     237    callList4[2].addCallback(increment); 
     238    var defList4 = new DeferredList(callList4, false, false, true); 
     239    defList4.addErrback(neverHappen); 
     240    callList4[1].addCallback(function (arg) { 
     241        is(arg, null, "deferredlist consumeErrors ok" ); 
     242    }); 
     243    callList4[0].callback(3); 
     244    callList4[1].callback("foo"); 
     245    callList4[2].callback(4); 
     246     
    165247     
    166248    /*