Promise
Promise.all=function(promises){
return new Promise((resolve,reject)=>{
promises=Array.from(promises);
const length=promises.length, results=[],_index=0;
if(length==0){
resolve(results)
return
}
promises.forEach((promise,index)=>{
Promise.resolve(promise).then(result=>{
results[index]=result;
if(length==++_index){
resolve(results)
}
}).catch(err=>{
reject(err)
})
})
})
}
Promise.race=function(promises){
return new Promise((resolve,reject)=>{
promises=Array.from(promises);
if(promises.length==0){
resolve()
return
}
promises.forEach((promise,index)=>{
Promise.resolve(promise).then(result=>{
resolve(result)
}).catch(err=>{
reject(err)
})
})
})
}
Promise.prototype.catch=function(onRejected){
return this.then(undefined,onRejected);
}
Promise.prototype.finally=function(onFinally){
var isFunction = typeof onFinally == "function";
return this.then(isFunction?(result)=>{
onFinally();
return result
}:onFinally,isFunction?(err)=>{
onFinally();
return Promise.reject(err)
}:onFinally);
}