Skip to content

Instantly share code, notes, and snippets.

@rainder
Last active November 22, 2017 16:50

Revisions

  1. rainder revised this gist Nov 22, 2017. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions JS::DeferredFnStack.js
    Original file line number Diff line number Diff line change
    @@ -3,12 +3,12 @@
    function DeferredFnStack(fn) {
    let stack = Promise.resolve();

    return () => {
    return (...args) => {
    const dfd = defer();

    stack = stack
    .catch(() => null)
    .then(() => fn().then(dfd.resolve, dfd.reject));
    .then(() => fn(...args).then(dfd.resolve, dfd.reject));

    return dfd.promise;
    };
  2. rainder revised this gist Jul 27, 2017. 1 changed file with 27 additions and 15 deletions.
    42 changes: 27 additions & 15 deletions JS::DeferredFnStack.js
    Original file line number Diff line number Diff line change
    @@ -1,30 +1,42 @@
    'use strict';
    const Q = require('q')

    function DeferredFnStack(fn) {
    let stack = Q.when();
    let stack = Promise.resolve();

    return () => {
    const dfd = defer();

    stack = stack
    .catch(() => null)
    .then(() => fn().then(dfd.resolve, dfd.reject));

    return function () {
    const dfd = Q.defer();
    stack = stack.fin(() => Q.when(fn()).then(dfd.resolve, dfd.reject));
    return dfd.promise;
    };

    /**
    *
    * @returns {{}}
    */
    function defer() {
    const dfd = {};

    dfd.promise = new Promise((resolve, reject) => {
    dfd.resolve = resolve;
    dfd.reject = reject;
    });

    return dfd;
    }
    }

    /**
    * USAGE
    */

    function asyncPromise(value) {
    return new Promise(function (resolve) {
    setTimeout(() => resolve(value), 500);
    const fn = DeferredFnStack(() => {
    return new Promise((resolve) => {
    setTimeout(() => resolve('hi'), 1000);
    });
    }

    const fn = DeferredFnStack(function () {
    return Q.resolve('Hello World!')
    .then(asyncPromise)
    .then(asyncPromise)
    });

    fn().then((value) => console.log(value));
    @@ -33,4 +45,4 @@ fn().then((value) => console.log(value));

    /*
    Outputs 3 times 'Hello World!' with 1000ms interval
    */
    */
  3. rainder revised this gist Jan 25, 2016. 1 changed file with 4 additions and 7 deletions.
    11 changes: 4 additions & 7 deletions JS::DeferredFnStack.js
    Original file line number Diff line number Diff line change
    @@ -4,7 +4,7 @@ const Q = require('q')
    function DeferredFnStack(fn) {
    let stack = Q.when();

    return () => {
    return function () {
    const dfd = Q.defer();
    stack = stack.fin(() => Q.when(fn()).then(dfd.resolve, dfd.reject));
    return dfd.promise;
    @@ -16,12 +16,9 @@ function DeferredFnStack(fn) {
    */

    function asyncPromise(value) {
    const dfd = Q.defer();

    const resolve = () => dfd.resolve(value)
    setTimeout(resolve, 500)

    return dfd.promise
    return new Promise(function (resolve) {
    setTimeout(() => resolve(value), 500);
    });
    }

    const fn = DeferredFnStack(function () {
  4. rainder renamed this gist Jan 25, 2016. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  5. rainder revised this gist Jan 25, 2016. 1 changed file with 30 additions and 29 deletions.
    59 changes: 30 additions & 29 deletions JS::DeferredFnStack
    Original file line number Diff line number Diff line change
    @@ -1,38 +1,39 @@
    Q = require 'q'
    'use strict';
    const Q = require('q')

    DeferredFnStack = (fn) ->
    stack = Q.when()
    function DeferredFnStack(fn) {
    let stack = Q.when();

    return ->
    dfd = Q.defer()
    stack = stack.fin -> Q.when(fn()).then(dfd.resolve, dfd.reject)
    dfd.promise
    return () => {
    const dfd = Q.defer();
    stack = stack.fin(() => Q.when(fn()).then(dfd.resolve, dfd.reject));
    return dfd.promise;
    };
    }

    ###
    USAGE
    ###
    /**
    * USAGE
    */

    asyncPromise = (value) ->
    dfd = Q.defer()
    function asyncPromise(value) {
    const dfd = Q.defer();

    resolve = ->
    dfd.resolve(value)
    const resolve = () => dfd.resolve(value)
    setTimeout(resolve, 500)

    setTimeout resolve, 500
    return dfd.promise
    }

    dfd.promise
    const fn = DeferredFnStack(function () {
    return Q.resolve('Hello World!')
    .then(asyncPromise)
    .then(asyncPromise)
    });

    fn().then((value) => console.log(value));
    fn().then((value) => console.log(value));
    fn().then((value) => console.log(value));

    fn = DeferredFnStack ->
    Q.resolve('Hello World!')
    .then asyncPromise
    .then asyncPromise


    fn().then (value) -> console.log value
    fn().then (value) -> console.log value
    fn().then (value) -> console.log value

    ###
    Outputs 3 times 'Hello World!' with 1000ms interval
    ###
    /*
    Outputs 3 times 'Hello World!' with 1000ms interval
    */
  6. rainder renamed this gist Aug 4, 2014. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  7. rainder revised this gist Jul 11, 2014. 1 changed file with 27 additions and 13 deletions.
    40 changes: 27 additions & 13 deletions DeferredFnStack
    Original file line number Diff line number Diff line change
    @@ -7,18 +7,32 @@ DeferredFnStack = (fn) ->
    dfd = Q.defer()
    stack = stack.fin -> Q.when(fn()).then(dfd.resolve, dfd.reject)
    dfd.promise


    # USAGE

    ###
    USAGE
    ###

    asyncPromise = (value) ->
    dfd = Q.defer()

    resolve = ->
    dfd.resolve(value)

    setTimeout resolve, 500

    dfd.promise


    fn = DeferredFnStack ->
    Q.when()
    .then asyncAction1
    .then asyncAction2
    .then asyncAction3

    fn()
    fn()
    fn()
    fn()
    fn()
    Q.resolve('Hello World!')
    .then asyncPromise
    .then asyncPromise


    fn().then (value) -> console.log value
    fn().then (value) -> console.log value
    fn().then (value) -> console.log value

    ###
    Outputs 3 times 'Hello World!' with 1000ms interval
    ###
  8. rainder revised this gist Jul 11, 2014. 1 changed file with 16 additions and 1 deletion.
    17 changes: 16 additions & 1 deletion DeferredFnStack
    Original file line number Diff line number Diff line change
    @@ -6,4 +6,19 @@ DeferredFnStack = (fn) ->
    return ->
    dfd = Q.defer()
    stack = stack.fin -> Q.when(fn()).then(dfd.resolve, dfd.reject)
    dfd.promise
    dfd.promise


    # USAGE

    fn = DeferredFnStack ->
    Q.when()
    .then asyncAction1
    .then asyncAction2
    .then asyncAction3

    fn()
    fn()
    fn()
    fn()
    fn()
  9. rainder revised this gist Jul 11, 2014. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions DeferredFnStack
    Original file line number Diff line number Diff line change
    @@ -1,9 +1,9 @@
    Q = require 'q'

    DeferredFnStack = (action) ->
    DeferredFnStack = (fn) ->
    stack = Q.when()

    return ->
    dfd = Q.defer()
    stack = stack.fin -> Q.when(action()).then(dfd.resolve, dfd.reject)
    stack = stack.fin -> Q.when(fn()).then(dfd.resolve, dfd.reject)
    dfd.promise
  10. rainder revised this gist Jul 11, 2014. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions DeferredFnStack
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,5 @@
    Q = require 'q'

    DeferredFnStack = (action) ->
    stack = Q.when()

  11. rainder created this gist Jul 11, 2014.
    7 changes: 7 additions & 0 deletions DeferredFnStack
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    DeferredFnStack = (action) ->
    stack = Q.when()

    return ->
    dfd = Q.defer()
    stack = stack.fin -> Q.when(action()).then(dfd.resolve, dfd.reject)
    dfd.promise