react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / har-validator / node_modules / bluebird / js / main / generators.js
81160 views"use strict";1module.exports = function(Promise,2apiRejection,3INTERNAL,4tryConvertToPromise) {5var errors = require("./errors.js");6var TypeError = errors.TypeError;7var util = require("./util.js");8var errorObj = util.errorObj;9var tryCatch = util.tryCatch;10var yieldHandlers = [];1112function promiseFromYieldHandler(value, yieldHandlers, traceParent) {13for (var i = 0; i < yieldHandlers.length; ++i) {14traceParent._pushContext();15var result = tryCatch(yieldHandlers[i])(value);16traceParent._popContext();17if (result === errorObj) {18traceParent._pushContext();19var ret = Promise.reject(errorObj.e);20traceParent._popContext();21return ret;22}23var maybePromise = tryConvertToPromise(result, traceParent);24if (maybePromise instanceof Promise) return maybePromise;25}26return null;27}2829function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {30var promise = this._promise = new Promise(INTERNAL);31promise._captureStackTrace();32this._stack = stack;33this._generatorFunction = generatorFunction;34this._receiver = receiver;35this._generator = undefined;36this._yieldHandlers = typeof yieldHandler === "function"37? [yieldHandler].concat(yieldHandlers)38: yieldHandlers;39}4041PromiseSpawn.prototype.promise = function () {42return this._promise;43};4445PromiseSpawn.prototype._run = function () {46this._generator = this._generatorFunction.call(this._receiver);47this._receiver =48this._generatorFunction = undefined;49this._next(undefined);50};5152PromiseSpawn.prototype._continue = function (result) {53if (result === errorObj) {54return this._promise._rejectCallback(result.e, false, true);55}5657var value = result.value;58if (result.done === true) {59this._promise._resolveCallback(value);60} else {61var maybePromise = tryConvertToPromise(value, this._promise);62if (!(maybePromise instanceof Promise)) {63maybePromise =64promiseFromYieldHandler(maybePromise,65this._yieldHandlers,66this._promise);67if (maybePromise === null) {68this._throw(69new TypeError(70"A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/4Y4pDk\u000a\u000a".replace("%s", value) +71"From coroutine:\u000a" +72this._stack.split("\n").slice(1, -7).join("\n")73)74);75return;76}77}78maybePromise._then(79this._next,80this._throw,81undefined,82this,83null84);85}86};8788PromiseSpawn.prototype._throw = function (reason) {89this._promise._attachExtraTrace(reason);90this._promise._pushContext();91var result = tryCatch(this._generator["throw"])92.call(this._generator, reason);93this._promise._popContext();94this._continue(result);95};9697PromiseSpawn.prototype._next = function (value) {98this._promise._pushContext();99var result = tryCatch(this._generator.next).call(this._generator, value);100this._promise._popContext();101this._continue(result);102};103104Promise.coroutine = function (generatorFunction, options) {105if (typeof generatorFunction !== "function") {106throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/6Vqhm0\u000a");107}108var yieldHandler = Object(options).yieldHandler;109var PromiseSpawn$ = PromiseSpawn;110var stack = new Error().stack;111return function () {112var generator = generatorFunction.apply(this, arguments);113var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,114stack);115spawn._generator = generator;116spawn._next(undefined);117return spawn.promise();118};119};120121Promise.coroutine.addYieldHandler = function(fn) {122if (typeof fn !== "function") throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");123yieldHandlers.push(fn);124};125126Promise.spawn = function (generatorFunction) {127if (typeof generatorFunction !== "function") {128return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/6Vqhm0\u000a");129}130var spawn = new PromiseSpawn(generatorFunction, this);131var ret = spawn.promise();132spawn._run(Promise.spawn);133return ret;134};135};136137138