33 * @license MIT
44 * @author Jim Chen
55 */
6- var BinArray = ( function ( ) {
6+ var BinArray = ( function ( ) {
77
88 var BinArray = { } ;
99
@@ -1266,7 +1266,7 @@ var CommentProvider = (function () {
12661266 var promises = [ ] ;
12671267 // TODO: This race logic needs to be rethought to provide redundancy
12681268 for ( var type in this . _staticSources ) {
1269- promises . push ( Promise . race ( this . _staticSources [ type ] )
1269+ promises . push ( Promises . any ( this . _staticSources [ type ] )
12701270 . then ( function ( data ) {
12711271 return this . applyParsersList ( data , type ) ;
12721272 } . bind ( this ) ) ) ;
@@ -1275,7 +1275,7 @@ var CommentProvider = (function () {
12751275 // No static loaders
12761276 return Promise . resolve ( [ ] ) ;
12771277 }
1278- return Promise . race ( promises ) . then ( function ( commentList ) {
1278+ return Promises . any ( promises ) . then ( function ( commentList ) {
12791279 for ( var i = 0 ; i < this . _targets . length ; i ++ ) {
12801280 this . _targets [ i ] . load ( commentList ) ;
12811281 }
@@ -1345,6 +1345,61 @@ var CommentProvider = (function () {
13451345 return CommentProvider ;
13461346} ) ( ) ;
13471347
1348+ /**
1349+ * Promises extra functionality
1350+ * @license MIT
1351+ * @author Jim Chen
1352+ */
1353+ var Promises = ( function ( ) {
1354+
1355+ var Promises = { } ;
1356+
1357+ /**
1358+ * Resolves as soon as any promise resolves in the order of the input array
1359+ *
1360+ * @param arr - array of promises
1361+ * @return promise that resolves if any one promise resolves and rejects
1362+ * if otherwise
1363+ **/
1364+ Promises . any = function ( promises ) {
1365+ if ( ! Array . isArray ( promises ) ) {
1366+ // Is raw object or promise, resolve it directly
1367+ return Promise . resolve ( promises ) ;
1368+ }
1369+ if ( promises . length === 0 ) {
1370+ // No promises to resolve so we think it failed
1371+ return Promise . reject ( ) ;
1372+ }
1373+ return new Promise ( function ( resolve , reject ) {
1374+ var hasResolved = false ;
1375+ var hasCompleted = 0 ;
1376+ var errors = [ ] ;
1377+ for ( var i = 0 ; i < promises . length ; i ++ ) {
1378+ promises [ i ] . then ( function ( value ) {
1379+ hasCompleted ++ ;
1380+ if ( ! hasResolved ) {
1381+ hasResolved = true ;
1382+ resolve ( value ) ;
1383+ }
1384+ } ) . catch ( ( function ( i ) {
1385+ return function ( e ) {
1386+ hasCompleted ++ ;
1387+ errors [ i ] = e ;
1388+ if ( hasCompleted === promises . length ) {
1389+ // All promises have completed and we are in rejecting case
1390+ if ( ! hasResolved ) {
1391+ reject ( errors ) ;
1392+ }
1393+ }
1394+ }
1395+ } ) ( i ) ) ;
1396+ }
1397+ } ) ;
1398+ } ;
1399+
1400+ return Promises ;
1401+ } ) ( ) ;
1402+
13481403/**
13491404 * Bilibili Format Parser
13501405 * Takes in an XMLDoc/LooseXMLDoc and parses that into a Generic Comment List
0 commit comments