소스 검색

promise immediately resolved by executor should also have special then

Adam Shaw 8 년 전
부모
커밋
ba7999b8d9
1개의 변경된 파일27개의 추가작업 그리고 15개의 파일을 삭제
  1. 27 15
      src/common/Promise.js

+ 27 - 15
src/common/Promise.js

@@ -3,31 +3,29 @@ var Promise = {
 
 	construct: function(executor) {
 		var deferred = $.Deferred();
+		var promise = deferred.promise();
 
 		if (typeof executor === 'function') {
 			executor(
-				function(value) { // resolve
-					deferred.resolve(value);
+				function(val) { // resolve
+					deferred.resolve(val);
+					attachImmediatelyResolvingThen(promise, val);
 				},
 				function() { // reject
 					deferred.reject();
+					attachImmediatelyRejectingThen(promise);
 				}
 			);
 		}
 
-		return deferred.promise();
+		return promise;
 	},
 
 	resolve: function(val) {
 		var deferred = $.Deferred().resolve(val);
 		var promise = deferred.promise();
 
-		// make .then callback execute immediately
-		promise.then = function(onResolve) {
-			if (typeof onResolve === 'function') {
-				onResolve(val);
-			}
-		};
+		attachImmediatelyResolvingThen(promise, val);
 
 		return promise;
 	},
@@ -36,16 +34,30 @@ var Promise = {
 		var deferred = $.Deferred().reject();
 		var promise = deferred.promise();
 
-		// make .then callback execute immediately
-		promise.then = function(onResolve, onReject) {
-			if (typeof onReject === 'function') {
-				onReject();
-			}
-		};
+		attachImmediatelyRejectingThen(promise);
 
 		return promise;
 	}
 
 };
 
+
+function attachImmediatelyResolvingThen(promise, val) {
+	promise.then = function(onResolve) {
+		if (typeof onResolve === 'function') {
+			onResolve(val);
+		}
+	};
+}
+
+
+function attachImmediatelyRejectingThen(promise) {
+	promise.then = function(onResolve, onReject) {
+		if (typeof onReject === 'function') {
+			onReject();
+		}
+	};
+}
+
+
 FC.Promise = Promise;