Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(884)

Side by Side Diff: third_party/polymer/components/promise-polyfill/Promise.js

Issue 2906483004: [pinpoint] Add iron-form and paper-checkbox to polymer components. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /**
2 @license
3 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
4 This code may only be used under the BSD style license found at http://polymer.g ithub.io/LICENSE.txt
5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 The complete set of contributors may be found at http://polymer.github.io/CONTRI BUTORS.txt
7 Code distributed by Google as part of the polymer project is also
8 subject to an additional IP rights grant found at http://polymer.github.io/PATEN TS.txt
9 */
10 function MakePromise (asap) {
11 function Promise(fn) {
12 if (typeof this !== 'object' || typeof fn !== 'function') throw new TypeError();
13 this._state = null;
14 this._value = null;
15 this._deferreds = []
16
17 doResolve(fn, resolve.bind(this), reject.bind(this));
18 }
19
20 function handle(deferred) {
21 var me = this;
22 if (this._state === null) {
23 this._deferreds.push(deferred);
24 return
25 }
26 asap(function() {
27 var cb = me._state ? deferred.onFulfilled : deferred.onR ejected
28 if (typeof cb !== 'function') {
29 (me._state ? deferred.resolve : deferred.reject) (me._value);
30 return;
31 }
32 var ret;
33 try {
34 ret = cb(me._value);
35 }
36 catch (e) {
37 deferred.reject(e);
38 return;
39 }
40 deferred.resolve(ret);
41 })
42 }
43
44 function resolve(newValue) {
45 try { //Promise Resolution Procedure: https://github.com/promise s-aplus/promises-spec#the-promise-resolution-procedure
46 if (newValue === this) throw new TypeError();
47 if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
48 var then = newValue.then;
49 if (typeof then === 'function') {
50 doResolve(then.bind(newValue), resolve.b ind(this), reject.bind(this));
51 return;
52 }
53 }
54 this._state = true;
55 this._value = newValue;
56 finale.call(this);
57 } catch (e) { reject.call(this, e); }
58 }
59
60 function reject(newValue) {
61 this._state = false;
62 this._value = newValue;
63 finale.call(this);
64 }
65
66 function finale() {
67 for (var i = 0, len = this._deferreds.length; i < len; i++) {
68 handle.call(this, this._deferreds[i]);
69 }
70 this._deferreds = null;
71 }
72
73 /**
74 * Take a potentially misbehaving resolver function and make sure
75 * onFulfilled and onRejected are only called once.
76 *
77 * Makes no guarantees about asynchrony.
78 */
79 function doResolve(fn, onFulfilled, onRejected) {
80 var done = false;
81 try {
82 fn(function (value) {
83 if (done) return;
84 done = true;
85 onFulfilled(value);
86 }, function (reason) {
87 if (done) return;
88 done = true;
89 onRejected(reason);
90 })
91 } catch (ex) {
92 if (done) return;
93 done = true;
94 onRejected(ex);
95 }
96 }
97
98 Promise.prototype['catch'] = function (onRejected) {
99 return this.then(null, onRejected);
100 };
101
102 Promise.prototype.then = function(onFulfilled, onRejected) {
103 var me = this;
104 return new Promise(function(resolve, reject) {
105 handle.call(me, {
106 onFulfilled: onFulfilled,
107 onRejected: onRejected,
108 resolve: resolve,
109 reject: reject
110 });
111 })
112 };
113
114 Promise.resolve = function (value) {
115 if (value && typeof value === 'object' && value.constructor === Promise) {
116 return value;
117 }
118
119 return new Promise(function (resolve) {
120 resolve(value);
121 });
122 };
123
124 Promise.reject = function (value) {
125 return new Promise(function (resolve, reject) {
126 reject(value);
127 });
128 };
129
130
131 return Promise;
132 }
133
134 if (typeof module !== 'undefined') {
135 module.exports = MakePromise;
136 }
137
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698