Question 81
Question
Answer
if (!Promise) {
window.Promise = function(executor) {
if (typeof executor !== 'function') {
throw new TypeError('Executor must be a function');
}
let state = 'pending';
let value;
let resolveQueue = [];
let rejectQueue = [];
const resolve = (v) => {
if (state === 'pending') {
value = v;
state = 'fulfilled';
processQueue(resolveQueue);
}
};
const reject = (r) => {
if (state === 'pending') {
value = r;
state = 'rejected';
processQueue(rejectQueue);
}
};
executor(resolve, reject);
const processQueue = (queue) => {
while (queue.length > 0) {
const callback = queue.shift();
try {
callback(value);
} catch (error) {
// Handle errors appropriately here
}
}
};
return {
then: function(onFulfilled, onRejected) {
if (typeof onFulfilled !== 'function') {
onFulfilled = value => value;
}
if (typeof onRejected !== 'function') {
onRejected = error => { throw error };
}
return new Promise((resolve, reject) => {
if (state === 'fulfilled') {
try {
resolve(onFulfilled(value));
} catch (error) {
reject(error);
}
} else if (state === 'rejected') {
try {
resolve(onRejected(value));
} catch (error) {
reject(error);
}
} else {
resolveQueue.push(() => {
try {
resolve(onFulfilled(value));
} catch (error) {
reject(error);
}
});
rejectQueue.push(() => {
try {
resolve(onRejected(value));
} catch (error) {
reject(error);
}
});
}
});
},
};
};
}Last updated