Created
March 4, 2016 10:45
-
-
Save kunihiro-qr/7e794f965606a3229129 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
(function(global){ | |
function isFunction(item) { | |
return typeof item === 'function'; | |
} | |
function extend(target, options){ | |
var copy; | |
if(typeof target !== "object" && !isFunction(target)){ | |
target = {}; | |
} | |
for(var name in options){ | |
target[name] = options[name]; | |
} | |
return target; | |
} | |
global.extend = extend; | |
})(window); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
(function(global){ | |
var paramSerialize = function(data){ | |
var s = []; | |
var add = function(key, value){ | |
value = isFunction( value ) ? value() : ( value == null ? "" : value ); | |
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); | |
}; | |
Object.keys(data).forEach(function(a, index){ | |
add(a, data[a]) | |
}); | |
return s.join("&"); | |
}; | |
//jsonp | |
var jsonp = function(args){ | |
var loaded = false; | |
var paramStr = paramSerialize(args.data); | |
var callbackName = args.callback ? args.callback : "callback"; | |
var response = {}; | |
if(paramStr){ | |
args.url += "?" + paramStr + "&callback=" + callbackName; | |
} | |
window[callbackName] = function(){ | |
response = arguments[0]; | |
}; | |
createJS(args.url, function() { | |
loaded = true; | |
args.onsuccess(response); | |
delete window[callbackName]; | |
}, function() { | |
if ( loaded ) { return; } | |
loaded = true; | |
args.onerror(response); | |
delete window[callbackName]; | |
}); | |
}; | |
var createJS = function(src, onloadend, onerror) { | |
var res = document.createElement('script'); | |
res.type = 'text/javascript'; | |
res.charset = 'utf-8'; | |
res.onload = onloadend || function() {}; | |
res.onerror = onerror || function() {}; | |
res.src = src; | |
document.getElementsByTagName('head')[0].appendChild(res); | |
return res; | |
}; | |
function isFunction(item) { | |
return typeof item === 'function'; | |
} | |
global.requestJsonp = jsonp; | |
})(window); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
(function(global){ | |
var PENDING = void 0; | |
var FULFILLED = 1; | |
var REJECTED = 2; | |
function isFunction(item) { | |
return typeof item === 'function'; | |
} | |
var Promise = function(resolver){ | |
var promise = this; | |
promise._state = undefined; | |
promise._subscribers = []; | |
try { | |
resolver(function resolvePromise(value){ | |
resolve(promise, value); | |
}, function rejectPromise(reason) { | |
reject(promise, reason); | |
}); | |
} catch(e) { | |
reject(promise, e); | |
} | |
}; | |
Promise.prototype = { | |
constructor: Promise, | |
then: function(onFulfillment, onRejection){ | |
var parent = this; | |
var state = parent._state; | |
if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) { | |
return this; | |
} | |
var child = new Promise(); | |
var result = parent._result; | |
subscribe(parent, child, onFulfillment, onRejection); | |
return child; | |
}, | |
resolve: function(object){ | |
var Constructor = this; | |
if (object && typeof object === 'object' && object.constructor === Constructor) { | |
return object; | |
} | |
var promise = new Constructor(noop); | |
resolve(promise, object); | |
return promise; | |
} | |
}; | |
function flush(callback, arg) { | |
return function(){ | |
return callback(arg); | |
} | |
} | |
function useSetTimeout(callback, arg) { | |
setTimeout(flush(callback, arg), 1); | |
} | |
var asap = function asap(callback, arg) { | |
useSetTimeout(callback, arg); | |
}; | |
function resolve(promise, value){ | |
fulfill(promise, value); | |
} | |
function subscribe(parent, child, onFulfillment, onRejection) { | |
var subscribers = parent._subscribers; | |
var length = subscribers.length; | |
parent._onerror = null; | |
subscribers[length] = child; | |
subscribers[length + FULFILLED] = onFulfillment; | |
subscribers[length + REJECTED] = onRejection; | |
} | |
function publish(promise) { | |
var subscribers = promise._subscribers; | |
var settled = promise._state; | |
if (subscribers.length === 0) { return; } | |
var child, callback, detail = promise._result; | |
for (var i = 0; i < subscribers.length; i += 3) { | |
child = subscribers[i]; | |
callback = subscribers[i + settled]; | |
if (child) { | |
invokeCallback(settled, child, callback, detail); | |
} | |
} | |
promise._subscribers.length = 0; | |
} | |
function cannotReturnOwn() { | |
return new TypeError('A promises callback cannot return that same promise.'); | |
} | |
function ErrorObject() { | |
this.error = null; | |
} | |
var TRY_CATCH_ERROR = new ErrorObject(); | |
function tryCatch(callback, detail) { | |
try { | |
return callback(detail); | |
} catch(e) { | |
TRY_CATCH_ERROR.error = e; | |
return TRY_CATCH_ERROR; | |
} | |
} | |
function invokeCallback(settled, promise, callback, detail) { | |
var hasCallback = isFunction(callback), | |
value, error, succeeded, failed; | |
if (hasCallback) { | |
value = tryCatch(callback, detail); | |
if (value === TRY_CATCH_ERROR) { | |
failed = true; | |
error = value.error; | |
value = null; | |
} else { | |
succeeded = true; | |
} | |
if (promise === value) { | |
reject(promise, cannotReturnOwn()); | |
} | |
} else { | |
value = detail; | |
succeeded = true; | |
} | |
} | |
function reject(promise, reason) { | |
if (promise._state !== PENDING) { return; } | |
promise._state = REJECTED; | |
promise._result = reason; | |
asap(publishRejection, promise); | |
} | |
function publishRejection(promise) { | |
if (promise._onerror) { | |
promise._onerror(promise._result); | |
} | |
publish(promise); | |
} | |
function fulfill(promise, value) { | |
if (promise._state !== PENDING) { return; } | |
promise._result = value; | |
promise._state = FULFILLED; | |
if (promise._subscribers.length !== 0) { | |
asap(publish, promise); | |
} | |
} | |
global.FPromise = Promise; | |
})(window); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment