UNPKG

2.37 kBJavaScriptView Raw
1// aggregator.js
2// A promise resolved when many promises get resolved.
3//
4// 13/04/08, JHR, extracted from l8.js
5//
6"use strict";
7
8// This file adds methods to the l8 global object
9var l8 = require( "l8/lib/l8.js" )
10exports.l8 = l8
11
12function Aggregator( list, is_and ){
13 this.allPromises = list
14 this.results = []
15 this.result = list.length
16 this.firePromise = null
17 this.isAnd = is_and
18}
19var ProtoAggregator = Aggregator.prototype
20
21l8.proto.aggregator = ProtoTask.all = function( ll ){
22// Make a promise that collects the outcome of sub promises.
23// The promise is never rejected. Instead, its value is an array of "results"
24// where each result is [err,rslt] for the corresponding promise.
25 var list = (arguments.length === 1 && (ll instanceof Array)) ? ll : arguments
26 return new Aggregator( list)
27}
28
29l8.proto.and = function( ll ){
30// l8.and()
31// Make a promise that depends on sub promises.
32 var list = (arguments.length === 1 && (ll instanceof Array)) ? ll : arguments
33 return new Aggregator( list, true)
34}
35
36ProtoAggregator.__defineGetter__( "promise", function(){
37 var promise = this.firePromise
38 if( promise )return promise
39 var that = this
40 var list = this.allPromises
41 this.firePromise = promise = MakePromise( list.length === 0)
42 var results = this.results
43 var len = list.length
44 if( !len ){
45 promise.resolve( results)
46 return promise
47 }
48 // ToDo: should respect order, need an index
49 function ok( r ){
50 try{
51 while( r instanceof Function ){
52 r = r.call( l8)
53 }
54 }catch( e ){
55 return ko( e)
56 }
57 if( r.then ){
58 r.then( ok, ko)
59 }else{
60 results.push( [null,r])
61 if( that.result ){ that.result = r }
62 if( results.length === list.length ){
63 promise.resolve( that.isAnd ? that.result : results)
64 }
65 }
66 }
67 function ko( e ){
68 results.push( [e,null])
69 if( results.length === list.length ){
70 promise.resolve( that.isAnd ? false : results)
71 }
72 }
73 var item
74 for( var ii = 0 ; ii < len ; ii++ ){
75 item = list[ii]
76 while( item instanceof Function ){
77 item = item.call( l8)
78 }
79 if( item.then ){
80 item.then( ok, ko)
81 }else{
82 ok( item)
83 }
84 }
85 return promise
86})
87
88ProtoAggregator.then = function( callback, errback ){
89// An aggregator is a promise too.
90 return this.promise.then( callback, errback)
91}
92