2018-10-23 01:05:09 +03:00
! function ( name , context , definition ) {
context [ name ] = definition ( ) , "undefined" != typeof module && module . exports ? module . exports = context [ name ] : "function" == typeof define && define . amd && define ( function ( ) {
return context [ name ]
} )
} ( "Promise" , "undefined" != typeof global ? global : this , function ( ) {
"use strict" ;
function schedule ( fn , self ) {
scheduling _queue . add ( fn , self ) , cycle || ( cycle = timer ( scheduling _queue . drain ) )
}
function isThenable ( o ) {
var _then , o _type = typeof o ;
return null == o || "object" != o _type && "function" != o _type || ( _then = o . then ) , "function" == typeof _then && _then
}
function notify ( ) {
for ( var i = 0 ; i < this . chain . length ; i ++ ) notifyIsolated ( this , 1 === this . state ? this . chain [ i ] . success : this . chain [ i ] . failure , this . chain [ i ] ) ;
this . chain . length = 0
}
function notifyIsolated ( self , cb , chain ) {
var ret , _then ;
try {
! 1 === cb ? chain . reject ( self . msg ) : ( ret = ! 0 === cb ? self . msg : cb . call ( void 0 , self . msg ) , ret === chain . promise ? chain . reject ( TypeError ( "Promise-chain cycle" ) ) : ( _then = isThenable ( ret ) ) ? _then . call ( ret , chain . resolve , chain . reject ) : chain . resolve ( ret ) )
} catch ( err ) {
chain . reject ( err )
}
}
function resolve ( msg ) {
var _then , self = this ;
if ( ! self . triggered ) {
self . triggered = ! 0 , self . def && ( self = self . def ) ;
try {
( _then = isThenable ( msg ) ) ? schedule ( function ( ) {
var def _wrapper = new MakeDefWrapper ( self ) ;
try {
_then . call ( msg , function ( ) {
resolve . apply ( def _wrapper , arguments )
} , function ( ) {
reject . apply ( def _wrapper , arguments )
} )
} catch ( err ) {
reject . call ( def _wrapper , err )
}
} ) : ( self . msg = msg , self . state = 1 , self . chain . length > 0 && schedule ( notify , self ) )
} catch ( err ) {
reject . call ( new MakeDefWrapper ( self ) , err )
}
}
}
function reject ( msg ) {
var self = this ;
self . triggered || ( self . triggered = ! 0 , self . def && ( self = self . def ) , self . msg = msg , self . state = 2 , self . chain . length > 0 && schedule ( notify , self ) )
}
function iteratePromises ( Constructor , arr , resolver , rejecter ) {
for ( var idx = 0 ; idx < arr . length ; idx ++ ) ! function ( idx ) {
Constructor . resolve ( arr [ idx ] ) . then ( function ( msg ) {
resolver ( idx , msg )
} , rejecter )
} ( idx )
}
function MakeDefWrapper ( self ) {
this . def = self , this . triggered = ! 1
}
function MakeDef ( self ) {
this . promise = self , this . state = 0 , this . triggered = ! 1 , this . chain = [ ] , this . msg = void 0
}
function Promise ( executor ) {
if ( "function" != typeof executor ) throw TypeError ( "Not a function" ) ;
if ( 0 !== this . _ _NPO _ _ ) throw TypeError ( "Not a promise" ) ;
this . _ _NPO _ _ = 1 ;
var def = new MakeDef ( this ) ;
this . then = function ( success , failure ) {
var o = {
success : "function" != typeof success || success ,
failure : "function" == typeof failure && failure
} ;
return o . promise = new this . constructor ( function ( resolve , reject ) {
if ( "function" != typeof resolve || "function" != typeof reject ) throw TypeError ( "Not a function" ) ;
o . resolve = resolve , o . reject = reject
} ) , def . chain . push ( o ) , 0 !== def . state && schedule ( notify , def ) , o . promise
} , this . catch = function ( failure ) {
return this . then ( void 0 , failure )
} ;
try {
executor . call ( void 0 , function ( msg ) {
resolve . call ( def , msg )
} , function ( msg ) {
reject . call ( def , msg )
} )
} catch ( err ) {
reject . call ( def , err )
}
}
var builtInProp , cycle , scheduling _queue , ToString = Object . prototype . toString ,
timer = "undefined" != typeof setImmediate ? function ( fn ) {
return setImmediate ( fn )
} : setTimeout ;
try {
Object . defineProperty ( { } , "x" , { } ) , builtInProp = function ( obj , name , val , config ) {
return Object . defineProperty ( obj , name , {
value : val ,
writable : ! 0 ,
configurable : ! 1 !== config
} )
}
} catch ( err ) {
builtInProp = function ( obj , name , val ) {
return obj [ name ] = val , obj
}
}
scheduling _queue = function ( ) {
function Item ( fn , self ) {
this . fn = fn , this . self = self , this . next = void 0
}
var first , last , item ;
return {
add : function ( fn , self ) {
item = new Item ( fn , self ) , last ? last . next = item : first = item , last = item , item = void 0
} ,
drain : function ( ) {
var f = first ;
for ( first = last = cycle = void 0 ; f ; ) f . fn . call ( f . self ) , f = f . next
}
}
} ( ) ;
var PromisePrototype = builtInProp ( { } , "constructor" , Promise , ! 1 ) ;
return Promise . prototype = PromisePrototype , builtInProp ( PromisePrototype , "__NPO__" , 0 , ! 1 ) , builtInProp ( Promise , "resolve" , function ( msg ) {
var Constructor = this ;
return msg && "object" == typeof msg && 1 === msg . _ _NPO _ _ ? msg : new Constructor ( function ( resolve , reject ) {
if ( "function" != typeof resolve || "function" != typeof reject ) throw TypeError ( "Not a function" ) ;
resolve ( msg )
} )
} ) , builtInProp ( Promise , "reject" , function ( msg ) {
return new this ( function ( resolve , reject ) {
if ( "function" != typeof resolve || "function" != typeof reject ) throw TypeError ( "Not a function" ) ;
reject ( msg )
} )
} ) , builtInProp ( Promise , "all" , function ( arr ) {
var Constructor = this ;
return "[object Array]" != ToString . call ( arr ) ? Constructor . reject ( TypeError ( "Not an array" ) ) : 0 === arr . length ? Constructor . resolve ( [ ] ) : new Constructor ( function ( resolve , reject ) {
if ( "function" != typeof resolve || "function" != typeof reject ) throw TypeError ( "Not a function" ) ;
var len = arr . length ,
msgs = Array ( len ) ,
count = 0 ;
iteratePromises ( Constructor , arr , function ( idx , msg ) {
msgs [ idx ] = msg , ++ count === len && resolve ( msgs )
} , reject )
} )
} ) , builtInProp ( Promise , "race" , function ( arr ) {
var Constructor = this ;
return "[object Array]" != ToString . call ( arr ) ? Constructor . reject ( TypeError ( "Not an array" ) ) : new Constructor ( function ( resolve , reject ) {
if ( "function" != typeof resolve || "function" != typeof reject ) throw TypeError ( "Not a function" ) ;
iteratePromises ( Constructor , arr , function ( idx , msg ) {
resolve ( msg )
} , reject )
} )
} ) , Promise
} ) ;