123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- 'use strict';
- //This file contains the ES6 extensions to the core Promises/A+ API
- var Promise = require('./core.js')
- var asap = require('asap')
- module.exports = Promise
- /* Static Functions */
- function ValuePromise(value) {
- this.then = function (onFulfilled) {
- if (typeof onFulfilled !== 'function') return this
- return new Promise(function (resolve, reject) {
- asap(function () {
- try {
- resolve(onFulfilled(value))
- } catch (ex) {
- reject(ex);
- }
- })
- })
- }
- }
- ValuePromise.prototype = Promise.prototype
- var TRUE = new ValuePromise(true)
- var FALSE = new ValuePromise(false)
- var NULL = new ValuePromise(null)
- var UNDEFINED = new ValuePromise(undefined)
- var ZERO = new ValuePromise(0)
- var EMPTYSTRING = new ValuePromise('')
- Promise.resolve = function (value) {
- if (value instanceof Promise) return value
- if (value === null) return NULL
- if (value === undefined) return UNDEFINED
- if (value === true) return TRUE
- if (value === false) return FALSE
- if (value === 0) return ZERO
- if (value === '') return EMPTYSTRING
- if (typeof value === 'object' || typeof value === 'function') {
- try {
- var then = value.then
- if (typeof then === 'function') {
- return new Promise(then.bind(value))
- }
- } catch (ex) {
- return new Promise(function (resolve, reject) {
- reject(ex)
- })
- }
- }
- return new ValuePromise(value)
- }
- Promise.all = function (arr) {
- var args = Array.prototype.slice.call(arr)
- return new Promise(function (resolve, reject) {
- if (args.length === 0) return resolve([])
- var remaining = args.length
- function res(i, val) {
- try {
- if (val && (typeof val === 'object' || typeof val === 'function')) {
- var then = val.then
- if (typeof then === 'function') {
- then.call(val, function (val) { res(i, val) }, reject)
- return
- }
- }
- args[i] = val
- if (--remaining === 0) {
- resolve(args);
- }
- } catch (ex) {
- reject(ex)
- }
- }
- for (var i = 0; i < args.length; i++) {
- res(i, args[i])
- }
- })
- }
- Promise.reject = function (value) {
- return new Promise(function (resolve, reject) {
- reject(value);
- });
- }
- Promise.race = function (values) {
- return new Promise(function (resolve, reject) {
- values.forEach(function(value){
- Promise.resolve(value).then(resolve, reject);
- })
- });
- }
- /* Prototype Methods */
- Promise.prototype['catch'] = function (onRejected) {
- return this.then(null, onRejected);
- }
|