更新request模块, 支持end不传参(返回Promise对象)
							parent
							
								
									99c95cf4a6
								
							
						
					
					
						commit
						b13b8573b9
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -5,233 +5,219 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"use strict";
 | 
					'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define(function(){
 | 
					define(function() {
 | 
				
			||||||
 | 
					    var _Promise = function(callback) {
 | 
				
			||||||
 | 
					        this.callback = [];
 | 
				
			||||||
 | 
					        var _this = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var _Promise = function(callback){
 | 
					        if (typeof this !== 'object')
 | 
				
			||||||
            this.callback = []
 | 
					            throw new TypeError('Promises must be constructed via new');
 | 
				
			||||||
            var _this = this
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(typeof this !== 'object')
 | 
					        if (typeof callback !== 'function')
 | 
				
			||||||
                throw new TypeError('Promises must be constructed via new')
 | 
					            throw new TypeError('Argument must be a function');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(typeof callback !== 'function')
 | 
					        callback(
 | 
				
			||||||
                throw new TypeError('Argument must be a function')
 | 
					            function(val) {
 | 
				
			||||||
 | 
					                _resolve(_this, val);
 | 
				
			||||||
            callback(function(val){
 | 
					            },
 | 
				
			||||||
                _resolve(_this, val)
 | 
					            function(val) {
 | 
				
			||||||
            }, function(val){
 | 
					                _reject(_this, val);
 | 
				
			||||||
                _reject(_this, val)
 | 
					 | 
				
			||||||
            })
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    var self = {
 | 
					    var self = {
 | 
				
			||||||
        _state: 1,
 | 
					        _state: 1,
 | 
				
			||||||
        _fired: 1,
 | 
					        _fired: 1,
 | 
				
			||||||
        _val: 1,
 | 
					        _val: 1,
 | 
				
			||||||
        callback: 1
 | 
					        callback: 1
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _Promise.prototype = {
 | 
					    _Promise.prototype = {
 | 
				
			||||||
        constructor: _Promise,
 | 
					        constructor: _Promise,
 | 
				
			||||||
        _state: 'pending',
 | 
					        _state: 'pending',
 | 
				
			||||||
        _fired: false,
 | 
					        _fired: false,
 | 
				
			||||||
        _fire: function(yes, no){
 | 
					        _fire: function(yes, no) {
 | 
				
			||||||
            if(this._state === 'rejected'){
 | 
					            if (this._state === 'rejected') {
 | 
				
			||||||
                if(typeof no === 'function')
 | 
					                if (typeof no === 'function') no(this._val);
 | 
				
			||||||
                    no(this._val)
 | 
					                else throw this._val;
 | 
				
			||||||
                else
 | 
					            } else {
 | 
				
			||||||
                    throw this._val
 | 
					                if (typeof yes === 'function') yes(this._val);
 | 
				
			||||||
            }else{
 | 
					 | 
				
			||||||
                if(typeof yes === 'function')
 | 
					 | 
				
			||||||
                    yes(this._val)
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        _then: function(yes, no){
 | 
					        _then: function(yes, no) {
 | 
				
			||||||
            if(this._fired){
 | 
					            if (this._fired) {
 | 
				
			||||||
                var _this = this
 | 
					                var _this = this;
 | 
				
			||||||
                fireCallback(_this, function(){
 | 
					                fireCallback(_this, function() {
 | 
				
			||||||
                    _this._fire(yes, no)
 | 
					                    _this._fire(yes, no);
 | 
				
			||||||
                })
 | 
					                });
 | 
				
			||||||
            }else{
 | 
					            } else {
 | 
				
			||||||
                this.callback.push({yes: yes, no: no})
 | 
					                this.callback.push({ yes: yes, no: no });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        then: function(yes, no){
 | 
					        then: function(yes, no) {
 | 
				
			||||||
            yes = typeof yes === 'function' ? yes : _yes
 | 
					            yes = typeof yes === 'function' ? yes : _yes;
 | 
				
			||||||
            no = typeof no === 'function' ? no : _no
 | 
					            no = typeof no === 'function' ? no : _no;
 | 
				
			||||||
            var _this = this
 | 
					            var _this = this;
 | 
				
			||||||
            var next = new _Promise(function(resolve, reject){
 | 
					            var next = new _Promise(function(resolve, reject) {
 | 
				
			||||||
 | 
					                _this._then(
 | 
				
			||||||
                    _this._then(function(val){
 | 
					                    function(val) {
 | 
				
			||||||
                        try{
 | 
					                        try {
 | 
				
			||||||
                            val = yes(val)
 | 
					                            val = yes(val);
 | 
				
			||||||
                        }catch(err){
 | 
					                        } catch (err) {
 | 
				
			||||||
                            return reject(err)
 | 
					                            return reject(err);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }, function(val){
 | 
					                    },
 | 
				
			||||||
                        try{
 | 
					                    function(val) {
 | 
				
			||||||
                            val = no(val)
 | 
					                        try {
 | 
				
			||||||
                        }catch(err){
 | 
					                            val = no(val);
 | 
				
			||||||
                            return reject(err)
 | 
					                        } catch (err) {
 | 
				
			||||||
 | 
					                            return reject(err);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        resolve(val)
 | 
					                        resolve(val);
 | 
				
			||||||
                    })
 | 
					 | 
				
			||||||
                })
 | 
					 | 
				
			||||||
            for(var i in _this){
 | 
					 | 
				
			||||||
                if(!self[i])
 | 
					 | 
				
			||||||
                    next[i] = _this[i]
 | 
					 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
            return next
 | 
					                );
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            for (var i in _this) {
 | 
				
			||||||
 | 
					                if (!self[i]) next[i] = _this[i];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return next;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        done: done,
 | 
					        done: done,
 | 
				
			||||||
        catch: fail,
 | 
					        catch: fail,
 | 
				
			||||||
        fail: fail
 | 
					        fail: fail
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _Promise.all = function(arr) {
 | 
				
			||||||
 | 
					        return _some(false, arr);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _Promise.race = function(arr) {
 | 
				
			||||||
 | 
					        return _some(true, arr);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _Promise.defer = defer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _yes(val) {
 | 
				
			||||||
 | 
					        return val;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _Promise.all = function(arr){
 | 
					    function _no(err) {
 | 
				
			||||||
        return _some(false, arr)
 | 
					        throw err;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _Promise.race = function(arr){
 | 
					    function done(callback) {
 | 
				
			||||||
        return _some(true, arr)
 | 
					        return this.then(callback, _no);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _Promise.defer = defer
 | 
					    function fail(callback) {
 | 
				
			||||||
 | 
					        return this.then(_yes, callback);
 | 
				
			||||||
// -----------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function _yes(val){
 | 
					 | 
				
			||||||
        return val
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function _no(err){
 | 
					    function defer() {
 | 
				
			||||||
        throw err
 | 
					        var obj = {};
 | 
				
			||||||
 | 
					        obj.promise = new this(function(yes, no) {
 | 
				
			||||||
 | 
					            obj.resolve = yes;
 | 
				
			||||||
 | 
					            obj.reject = no;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return obj;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    function done(callback){
 | 
					 | 
				
			||||||
        return this.then(callback, _no)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function fail(callback){
 | 
					 | 
				
			||||||
        return this.then(_yes, callback)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function defer(){
 | 
					 | 
				
			||||||
        var obj = {}
 | 
					 | 
				
			||||||
        obj.promise = new this(function(yes, no){
 | 
					 | 
				
			||||||
            obj.resolve = yes
 | 
					 | 
				
			||||||
            obj.reject = no
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
        return obj
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    //成功的回调
 | 
					    //成功的回调
 | 
				
			||||||
    function _resolve(obj, val){
 | 
					    function _resolve(obj, val) {
 | 
				
			||||||
        if(obj._state !== 'pending')
 | 
					        if (obj._state !== 'pending') return;
 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(val && typeof val.then === 'function'){
 | 
					        if (val && typeof val.then === 'function') {
 | 
				
			||||||
            var method = val instanceof _Promise ? '_then' : 'then'
 | 
					            var method = val instanceof _Promise ? '_then' : 'then';
 | 
				
			||||||
            val[method](function(v){
 | 
					            val[method](
 | 
				
			||||||
                _transmit(obj, v, true)
 | 
					                function(v) {
 | 
				
			||||||
            }, function(v){
 | 
					                    _transmit(obj, v, true);
 | 
				
			||||||
                _transmit(obj, v, false)
 | 
					                },
 | 
				
			||||||
            })
 | 
					                function(v) {
 | 
				
			||||||
        }else{
 | 
					                    _transmit(obj, v, false);
 | 
				
			||||||
            _transmit(obj, val, true)
 | 
					                }
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            _transmit(obj, val, true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //失败的回调
 | 
					    //失败的回调
 | 
				
			||||||
    function _reject(obj, val){
 | 
					    function _reject(obj, val) {
 | 
				
			||||||
        if(obj._state !== 'pending')
 | 
					        if (obj._state !== 'pending') return;
 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _transmit(obj, val, false)
 | 
					        _transmit(obj, val, false);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 改变Promise的_fired值,并保持用户传参,触发所有回调
 | 
					    // 改变Promise的_fired值,并保持用户传参,触发所有回调
 | 
				
			||||||
    function _transmit(obj, val, isResolved){
 | 
					    function _transmit(obj, val, isResolved) {
 | 
				
			||||||
        obj._fired = true
 | 
					        obj._fired = true;
 | 
				
			||||||
        obj._val = val
 | 
					        obj._val = val;
 | 
				
			||||||
        obj._state = isResolved ? 'fulfilled' : 'rejected'
 | 
					        obj._state = isResolved ? 'fulfilled' : 'rejected';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fireCallback(obj, function(){
 | 
					        fireCallback(obj, function() {
 | 
				
			||||||
            for(var i in obj.callback){
 | 
					            for (var i in obj.callback) {
 | 
				
			||||||
                obj._fire(obj.callback[i].yes, obj.callback[i].no)
 | 
					                obj._fire(obj.callback[i].yes, obj.callback[i].no);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function fireCallback(obj, callback) {
 | 
				
			||||||
 | 
					        var isAsync = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function fireCallback(obj, callback){
 | 
					        if (typeof obj.async === 'boolean') isAsync = obj.async;
 | 
				
			||||||
        var isAsync = false
 | 
					        else isAsync = obj.async = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(typeof obj.async === 'boolean')
 | 
					        if (isAsync) setTimeout(callback, 0);
 | 
				
			||||||
            isAsync = obj.async
 | 
					        else callback();
 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            isAsync = obj.async = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if(isAsync)
 | 
					 | 
				
			||||||
            setTimeout(callback, 0)
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            callback()
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _some(bool, iterable) {
 | 
				
			||||||
 | 
					        iterable = Array.isArray(iterable) ? iterable : [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function _some(bool, iterable){
 | 
					        var n = 0;
 | 
				
			||||||
        iterable = Array.isArray(iterable) ? iterable : []
 | 
					        var res = [];
 | 
				
			||||||
 | 
					        var end = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var n = 0
 | 
					        return new _Promise(function(yes, no) {
 | 
				
			||||||
        var res = []
 | 
					            if (!iterable.length) no(res);
 | 
				
			||||||
        var end = false
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new _Promise(function(yes, no){
 | 
					            function loop(obj, idx) {
 | 
				
			||||||
            if(!iterable.length)
 | 
					                obj.then(
 | 
				
			||||||
                no(res)
 | 
					                    function(val) {
 | 
				
			||||||
 | 
					                        if (!end) {
 | 
				
			||||||
            function loop(obj, idx){
 | 
					                            res[idx] = val;
 | 
				
			||||||
                obj.then(function(val){
 | 
					                            n++;
 | 
				
			||||||
                    if(!end){
 | 
					                            if (bool || n >= iterable.length) {
 | 
				
			||||||
                        res[idx] = val
 | 
					                                yes(bool ? val : res);
 | 
				
			||||||
                        n++
 | 
					                                end = true;
 | 
				
			||||||
                        if(bool || n >= iterable.length){
 | 
					 | 
				
			||||||
                            yes(bool ? val : res)
 | 
					 | 
				
			||||||
                            end = true
 | 
					 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                }, function(val){
 | 
					                    },
 | 
				
			||||||
                    end = true
 | 
					                    function(val) {
 | 
				
			||||||
                    no(val)
 | 
					                        end = true;
 | 
				
			||||||
                })
 | 
					                        no(val);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for(var i = 0, len = iterable.length; i < len; i++){
 | 
					            for (var i = 0, len = iterable.length; i < len; i++) {
 | 
				
			||||||
                loop(iterable[i], i)
 | 
					                loop(iterable[i], i);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ---------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ---------------------------------------------------------------
 | 
					    var nativePromise = window.Promise;
 | 
				
			||||||
 | 
					    if (/native code/.test(nativePromise)) {
 | 
				
			||||||
 | 
					        nativePromise.prototype.done = done;
 | 
				
			||||||
    var nativePromise = window.Promise
 | 
					        nativePromise.prototype.fail = fail;
 | 
				
			||||||
    if(/native code/.test(nativePromise)){
 | 
					        if (!nativePromise.defer) nativePromise.defer = defer;
 | 
				
			||||||
        nativePromise.prototype.done = done
 | 
					 | 
				
			||||||
        nativePromise.prototype.fail = fail
 | 
					 | 
				
			||||||
        if(!nativePromise.defer)
 | 
					 | 
				
			||||||
            nativePromise.defer = defer
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return window.Promise = nativePromise || _Promise
 | 
					    return (window.Promise = nativePromise || _Promise);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in New Issue