Promise .all .race .catch .finally

385 阅读1分钟

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);
}