mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-07 16:37:02 +03:00
Promises (first look)
Thread dropdown Small fixes
This commit is contained in:
parent
dd41d30f9b
commit
c23ba31e17
61 changed files with 12442 additions and 130 deletions
1026
vendors/Q/design/README.js
vendored
Normal file
1026
vendors/Q/design/README.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
22
vendors/Q/design/q0.js
vendored
Normal file
22
vendors/Q/design/q0.js
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
value = _value;
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
var callback = pending[i];
|
||||
callback(value);
|
||||
}
|
||||
pending = undefined;
|
||||
},
|
||||
then: function (callback) {
|
||||
if (pending) {
|
||||
pending.push(callback);
|
||||
} else {
|
||||
callback(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
26
vendors/Q/design/q1.js
vendored
Normal file
26
vendors/Q/design/q1.js
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = _value;
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
var callback = pending[i];
|
||||
callback(value);
|
||||
}
|
||||
pending = undefined;
|
||||
} else {
|
||||
throw new Error("A promise can only be resolved once.");
|
||||
}
|
||||
},
|
||||
then: function (callback) {
|
||||
if (pending) {
|
||||
pending.push(callback);
|
||||
} else {
|
||||
callback(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
33
vendors/Q/design/q2.js
vendored
Normal file
33
vendors/Q/design/q2.js
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
var Promise = function () {
|
||||
};
|
||||
|
||||
var isPromise = function (value) {
|
||||
return value instanceof Promise;
|
||||
};
|
||||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
var promise = new Promise();
|
||||
promise.then = function (callback) {
|
||||
if (pending) {
|
||||
pending.push(callback);
|
||||
} else {
|
||||
callback(value);
|
||||
}
|
||||
};
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = _value;
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
var callback = pending[i];
|
||||
callback(value);
|
||||
}
|
||||
pending = undefined;
|
||||
}
|
||||
},
|
||||
promise: promise
|
||||
};
|
||||
};
|
||||
|
||||
30
vendors/Q/design/q3.js
vendored
Normal file
30
vendors/Q/design/q3.js
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
|
||||
var isPromise = function (value) {
|
||||
return value && typeof value.then === "function";
|
||||
};
|
||||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = _value;
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
var callback = pending[i];
|
||||
callback(value);
|
||||
}
|
||||
pending = undefined;
|
||||
}
|
||||
},
|
||||
promise: {
|
||||
then: function (callback) {
|
||||
if (pending) {
|
||||
pending.push(callback);
|
||||
} else {
|
||||
callback(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
48
vendors/Q/design/q4.js
vendored
Normal file
48
vendors/Q/design/q4.js
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
|
||||
var isPromise = function (value) {
|
||||
return value && typeof value.then === "function";
|
||||
};
|
||||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = ref(_value); // values wrapped in a promise
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
var callback = pending[i];
|
||||
value.then(callback); // then called instead
|
||||
}
|
||||
pending = undefined;
|
||||
}
|
||||
},
|
||||
promise: {
|
||||
then: function (_callback) {
|
||||
var result = defer();
|
||||
// callback is wrapped so that its return
|
||||
// value is captured and used to resolve the promise
|
||||
// that "then" returns
|
||||
var callback = function (value) {
|
||||
result.resolve(_callback(value));
|
||||
};
|
||||
if (pending) {
|
||||
pending.push(callback);
|
||||
} else {
|
||||
value.then(callback);
|
||||
}
|
||||
return result.promise;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var ref = function (value) {
|
||||
if (value && typeof value.then === "function")
|
||||
return value;
|
||||
return {
|
||||
then: function (callback) {
|
||||
return ref(callback(value));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
56
vendors/Q/design/q5.js
vendored
Normal file
56
vendors/Q/design/q5.js
vendored
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
var isPromise = function (value) {
|
||||
return value && typeof value.then === "function";
|
||||
};
|
||||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = ref(_value);
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
// apply the pending arguments to "then"
|
||||
value.then.apply(value, pending[i]);
|
||||
}
|
||||
pending = undefined;
|
||||
}
|
||||
},
|
||||
promise: {
|
||||
then: function (_callback, _errback) {
|
||||
var result = defer();
|
||||
var callback = function (value) {
|
||||
result.resolve(_callback(value));
|
||||
};
|
||||
var errback = function (reason) {
|
||||
result.resolve(_errback(reason));
|
||||
};
|
||||
if (pending) {
|
||||
pending.push([callback, errback]);
|
||||
} else {
|
||||
value.then(callback, errback);
|
||||
}
|
||||
return result.promise;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var ref = function (value) {
|
||||
if (value && typeof value.then === "function")
|
||||
return value;
|
||||
return {
|
||||
then: function (callback) {
|
||||
return ref(callback(value));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var reject = function (reason) {
|
||||
return {
|
||||
then: function (callback, errback) {
|
||||
return ref(errback(reason));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
64
vendors/Q/design/q6.js
vendored
Normal file
64
vendors/Q/design/q6.js
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
|
||||
var isPromise = function (value) {
|
||||
return value && typeof value.then === "function";
|
||||
};
|
||||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = ref(_value);
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
value.then.apply(value, pending[i]);
|
||||
}
|
||||
pending = undefined;
|
||||
}
|
||||
},
|
||||
promise: {
|
||||
then: function (_callback, _errback) {
|
||||
var result = defer();
|
||||
// provide default callbacks and errbacks
|
||||
_callback = _callback || function (value) {
|
||||
// by default, forward fulfillment
|
||||
return value;
|
||||
};
|
||||
_errback = _errback || function (reason) {
|
||||
// by default, forward rejection
|
||||
return reject(reason);
|
||||
};
|
||||
var callback = function (value) {
|
||||
result.resolve(_callback(value));
|
||||
};
|
||||
var errback = function (reason) {
|
||||
result.resolve(_errback(reason));
|
||||
};
|
||||
if (pending) {
|
||||
pending.push([callback, errback]);
|
||||
} else {
|
||||
value.then(callback, errback);
|
||||
}
|
||||
return result.promise;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var ref = function (value) {
|
||||
if (value && typeof value.then === "function")
|
||||
return value;
|
||||
return {
|
||||
then: function (callback) {
|
||||
return ref(callback(value));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var reject = function (reason) {
|
||||
return {
|
||||
then: function (callback, errback) {
|
||||
return ref(errback(reason));
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
126
vendors/Q/design/q7.js
vendored
Normal file
126
vendors/Q/design/q7.js
vendored
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
|
||||
var enqueue = function (callback) {
|
||||
//process.nextTick(callback); // NodeJS
|
||||
setTimeout(callback, 1); // Naïve browser solution
|
||||
};
|
||||
|
||||
var isPromise = function (value) {
|
||||
return value && typeof value.then === "function";
|
||||
};
|
||||
|
||||
var defer = function () {
|
||||
var pending = [], value;
|
||||
return {
|
||||
resolve: function (_value) {
|
||||
if (pending) {
|
||||
value = ref(_value);
|
||||
for (var i = 0, ii = pending.length; i < ii; i++) {
|
||||
// XXX
|
||||
enqueue(function () {
|
||||
value.then.apply(value, pending[i]);
|
||||
});
|
||||
}
|
||||
pending = undefined;
|
||||
}
|
||||
},
|
||||
promise: {
|
||||
then: function (_callback, _errback) {
|
||||
var result = defer();
|
||||
_callback = _callback || function (value) {
|
||||
return value;
|
||||
};
|
||||
_errback = _errback || function (reason) {
|
||||
return reject(reason);
|
||||
};
|
||||
var callback = function (value) {
|
||||
result.resolve(_callback(value));
|
||||
};
|
||||
var errback = function (reason) {
|
||||
result.resolve(_errback(reason));
|
||||
};
|
||||
if (pending) {
|
||||
pending.push([callback, errback]);
|
||||
} else {
|
||||
// XXX
|
||||
enqueue(function () {
|
||||
value.then(callback, errback);
|
||||
});
|
||||
}
|
||||
return result.promise;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var ref = function (value) {
|
||||
if (value && value.then)
|
||||
return value;
|
||||
return {
|
||||
then: function (callback) {
|
||||
var result = defer();
|
||||
// XXX
|
||||
enqueue(function () {
|
||||
result.resolve(callback(value));
|
||||
});
|
||||
return result.promise;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var reject = function (reason) {
|
||||
return {
|
||||
then: function (callback, errback) {
|
||||
var result = defer();
|
||||
// XXX
|
||||
enqueue(function () {
|
||||
result.resolve(errback(reason));
|
||||
});
|
||||
return result.promise;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var when = function (value, _callback, _errback) {
|
||||
var result = defer();
|
||||
var done;
|
||||
|
||||
_callback = _callback || function (value) {
|
||||
return value;
|
||||
};
|
||||
_errback = _errback || function (reason) {
|
||||
return reject(reason);
|
||||
};
|
||||
|
||||
// XXX
|
||||
var callback = function (value) {
|
||||
try {
|
||||
return _callback(value);
|
||||
} catch (reason) {
|
||||
return reject(reason);
|
||||
}
|
||||
};
|
||||
var errback = function (reason) {
|
||||
try {
|
||||
return _errback(reason);
|
||||
} catch (reason) {
|
||||
return reject(reason);
|
||||
}
|
||||
};
|
||||
|
||||
enqueue(function () {
|
||||
ref(value).then(function (value) {
|
||||
if (done)
|
||||
return;
|
||||
done = true;
|
||||
result.resolve(ref(value).then(callback, errback));
|
||||
}, function (reason) {
|
||||
if (done)
|
||||
return;
|
||||
done = true;
|
||||
result.resolve(errback(reason));
|
||||
});
|
||||
});
|
||||
|
||||
return result.promise;
|
||||
};
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue