react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / har-validator / node_modules / bluebird / js / main / map.js
81160 views"use strict";1module.exports = function(Promise,2PromiseArray,3apiRejection,4tryConvertToPromise,5INTERNAL) {6var async = require("./async.js");7var util = require("./util.js");8var tryCatch = util.tryCatch;9var errorObj = util.errorObj;10var PENDING = {};11var EMPTY_ARRAY = [];1213function MappingPromiseArray(promises, fn, limit, _filter) {14this.constructor$(promises);15this._promise._captureStackTrace();16this._callback = fn;17this._preservedValues = _filter === INTERNAL18? new Array(this.length())19: null;20this._limit = limit;21this._inFlight = 0;22this._queue = limit >= 1 ? [] : EMPTY_ARRAY;23async.invoke(init, this, undefined);24}25util.inherits(MappingPromiseArray, PromiseArray);26function init() {this._init$(undefined, -2);}2728MappingPromiseArray.prototype._init = function () {};2930MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {31var values = this._values;32var length = this.length();33var preservedValues = this._preservedValues;34var limit = this._limit;35if (values[index] === PENDING) {36values[index] = value;37if (limit >= 1) {38this._inFlight--;39this._drainQueue();40if (this._isResolved()) return;41}42} else {43if (limit >= 1 && this._inFlight >= limit) {44values[index] = value;45this._queue.push(index);46return;47}48if (preservedValues !== null) preservedValues[index] = value;4950var callback = this._callback;51var receiver = this._promise._boundTo;52this._promise._pushContext();53var ret = tryCatch(callback).call(receiver, value, index, length);54this._promise._popContext();55if (ret === errorObj) return this._reject(ret.e);5657var maybePromise = tryConvertToPromise(ret, this._promise);58if (maybePromise instanceof Promise) {59maybePromise = maybePromise._target();60if (maybePromise._isPending()) {61if (limit >= 1) this._inFlight++;62values[index] = PENDING;63return maybePromise._proxyPromiseArray(this, index);64} else if (maybePromise._isFulfilled()) {65ret = maybePromise._value();66} else {67return this._reject(maybePromise._reason());68}69}70values[index] = ret;71}72var totalResolved = ++this._totalResolved;73if (totalResolved >= length) {74if (preservedValues !== null) {75this._filter(values, preservedValues);76} else {77this._resolve(values);78}7980}81};8283MappingPromiseArray.prototype._drainQueue = function () {84var queue = this._queue;85var limit = this._limit;86var values = this._values;87while (queue.length > 0 && this._inFlight < limit) {88if (this._isResolved()) return;89var index = queue.pop();90this._promiseFulfilled(values[index], index);91}92};9394MappingPromiseArray.prototype._filter = function (booleans, values) {95var len = values.length;96var ret = new Array(len);97var j = 0;98for (var i = 0; i < len; ++i) {99if (booleans[i]) ret[j++] = values[i];100}101ret.length = j;102this._resolve(ret);103};104105MappingPromiseArray.prototype.preservedValues = function () {106return this._preservedValues;107};108109function map(promises, fn, options, _filter) {110var limit = typeof options === "object" && options !== null111? options.concurrency112: 0;113limit = typeof limit === "number" &&114isFinite(limit) && limit >= 1 ? limit : 0;115return new MappingPromiseArray(promises, fn, limit, _filter);116}117118Promise.prototype.map = function (fn, options) {119if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");120121return map(this, fn, options, null).promise();122};123124Promise.map = function (promises, fn, options, _filter) {125if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");126return map(promises, fn, options, _filter).promise();127};128129130};131132133