Igor Baklan (2017-01-14T14:56:41.000Z)
io.baklan at gmail.com (2017-01-14T21:12:25.232Z)
Actually initial discussion which "inspires" me on this thoughts was in [cancellation-tokens-related](/topic/cancel-promise-pattern-no-cancellable-promises) topic. So here I didn't mean that it is impossible to implement that kind of functionality on "home made" promises. I mean that it would be good to have such functionality to "cancel"/"interrupt" execution flow of natively generated promises, in particular to do some "cancellation" of ``async`` task represented by ``async function`` or "unsubscribe" callback in construction ``consumer = provider.then(treatSomehow);`` and then write ``consumer.throw(new CancelationError("some reason"))`` instead of writing ``consumer.cancel()`` which might be "controversial" (whether we intend to cancel ``provider`` too, in which form we would like to do that (on which "rail" that cancellation should be delivered? on success-rail, on failure-rail or on some other extra-toxic cancellation-rail)). Ofcourse it can be some very raw tools to do cancellation, but if they were present, any "home made cancellation" would be much more doable and easy to implement then it is now. Regarding ``finally``/``return`` relationship I didn't mean that it is some special feature of generators, instead, ofcourse I first of all check it on regular functions (not only on js but in java too), and for me it was more remarkable that ``return`` can be "replaced" with ``break`` or ``continue`` by the means of ``finally`` block which is more interesting case then replacing ``return`` with ``trow`` or vise versa (which ofcourse also may lead to rather "strange" behavior and rare developer can guess that and/or imagine that strange situation before someone else told him about it). So putting that example with implicit ``return`` <--> ``continue`` replacement I didn't mean to show some "extra" behavior of ``generator.return()`` I only would like to highlight that ``function*`` generators implementation of ``.return`` is QUIT VALID and really simulates ``return`` behavior in place of ``yield`` instruction (without omitting any strange "outcome" on execution flow which ``finally`` block may produce). And it is actually one of key differences with how bluebirdjs cancleation works as follows from [bluebirdjs-cancellation]( http://bluebirdjs.com/docs/api/cancellation.html). There is assumed that cancellation action cause that "only active finally blocks (finally callbacks) are executed" and then cancellation completes (there are no chance to "override" cancellation propagation from finally callbacks in that api) while in "real code" it is possible (and in generators to ...). By the way in flavor of ``Promise.resolve`` and ``Promise.reject`` I would rather "rename" ``Q.deferred`` into ``Promise.never``, in fact it would be almost the same - factory of some promises that never completes it self by its own but rather wait until someone pushes it from outside by the means of abnormal ``.return`` or ``.throw``. It looks maybe little bit strange, but describes the thing nicely :)
io.baklan at gmail.com (2017-01-14T21:11:52.318Z)
Actually initial discussion which "inspires" me on this thoughts was in [cancellation-tokens-related](/topic/cancel-promise-pattern-no-cancellable-promises) topic. So here I didn't mean that it is impossible to implement that kind of functionality on "home made" promises. I mean that it would be good to have such functionality to "cancel"/"interrupt" execution flow of natively generated promises, in particular to do some "cancellation" of ``async`` task represented by ``async function`` or "unsubscribe" callback in construction ``consumer = provider.then(treatSomehow);`` and then write ``consumer.throw(new CancelationError("some reason"))`` instead of writing ``consumer.cancel()`` which might be "controversial" (whether we intend to cancel ``provider`` too, in which form we would like to do that (on which "rail" that cancellation should be delivered? on success-rail, on failure-rail or on some other extra-toxic cancellation-rail)). Ofcourse it can be some very raw tools to do cancellation, but if they were present, any "home made cancellation" would be much more doable and easy to implement then it is now. Regarding ``finally``/``return`` relationship I didn't mean that it is some special feature of generators, instead, ofcourse I first of all check it on regular functions (not only on js but in java too), and for me it was more remarkable that ``return`` can be "replaced" with ``break`` or ``continue`` by the means of ``finally`` block which is more interesting case then replacing ``return`` with ``trow`` or vise versa (which ofcourse also may lead to rather "strange" behavior and rare developer can guess that and/or imagine that strange situation before someone else told him about it). So putting that example with implicit ``return`` <--> ``continue`` replacement I didn't mean to show some "extra" behavior of ``generator.return()`` I only would like to highlight that ``function*`` generators implementation of ``.return`` is QUIT VALID and really simulates ``return`` behavior in place of ``yield`` instruction (without omitting any strange "outcome" on execution flow which ``finally`` block may produce). And it is actually one of key differences with how bluebirdjs cancleation works as follows from [bluebirdjs-cancellation]( http://bluebirdjs.com/docs/api/cancellation.html). There is assumed that cancellation action cause that "only active finally blocks (finally callbacks) are executed" and then cancellation completes (there are no chance to "override" cancellation propagation from finally callbacks in that api) while in "real code" it is possible (and in generators to ...). By the way in flavor of ``Promise.resolve`` and ``Promise.reject`` I would rather "rename" ``Q.deferred`` into ``Promise.never``, in fact it would be almost the same - factory of some promises that never completes it self by its own but rather wait until someone pushes it from outside by the means of abnormal ``.return`` or ``.throw``. It looks may be little bit strange, but describes the thing nicely :)
io.baklan at gmail.com (2017-01-14T21:07:32.803Z)
Actually initial discussion which "inspires" me on this thoughts was in [cancellation-tokens-related](/topic/cancel-promise-pattern-no-cancellable-promises) topic. So here I didn't mean that it is impossible to implement that kind of functionality on "home made" promises. I mean that it would be good to have such functionality to "cancel"/"interrupt" execution flow of natively generated promises, in particular to do some "cancellation" of ``async`` task represented by ``async function`` or "unsubscribe" callback in construction ``consumer = provider.then(treatSomehow);`` and then write ``consumer.throw(new CancelationError("some reason"))`` instead of writing ``consumer.cancel()`` which might be "controversial" (whether we intend to cancel ``provider`` too, in which form we would like to do that (on which "rail" that cancellation should be delivered? on success-rail, on failure-rail or on some other extra-toxic cancellation-rail)). Ofcourse it can be some very raw tools to do cancellation, but if they were present, any "home made cancellation" would be much more doable and easy to implement then it is now. Regarding ``finally``/``return`` relationship I didn't mean that it is some special feature of generators, instead, ofcourse I first of all check it on regular functions (not only on js but in java too), and for me it was more remarkable that ``return`` can be "replaced" with ``break`` or ``continue`` by the means of ``finally`` block which is more interesting case then replacing ``return`` with ``trow`` or vise versa (which ofcourse also may lead to rather "strange" behavior and rare developer can guess that and/or imagine that strange situation before someone else told him about it). So putting that example with implicit ``return`` <--> ``continue`` replacement I didn't mean to show some "extra" behavior of ``generator.return()`` I only would like to highlight that ``function*`` generators implementation of ``.return`` is QUIT VALID and really simulates ``return`` behavior in place of ``yield`` instruction (without omitting any strange "outcome" on execution flow which ``finally`` block may produce). And it is actually one of key differences with how bluebirdjs cancleation works as follows from [bluebirdjs-cancellation]( http://bluebirdjs.com/docs/api/cancellation.html). There is assumed that cancellation action cause that "only active finally blocks (finally callbacks) are executed" and then cancellation completes (there are no chance to "override" cancellation propagation from finally callbacks in that api) while in "real code" it is possible (and in generators to ...). By the way in flavor of ``Promise.resolve`` and ``Promise.reject`` I would rather "rename" ``Q.deferred`` into ``Promise.never``, in fact it would be almost the same - factory of some promises that never completes it self by its own but rather wait until someone pushes it from outside by the means of abnormal ``.return`` or ``.throw``. Looks may be little bit strange, but describes the thing nicely :)
io.baklan at gmail.com (2017-01-14T21:06:43.916Z)
Actually initial discussion which "inspires" me on this thoughts was in [cancellation-tokens-related](/topic/cancel-promise-pattern-no-cancellable-promises) topic. So here I didn't mean that it is impossible to implement that kind of functionality on "home made" promises. I mean that it would be good to have such functionality to "cancel"/"interrupt" execution flow of natively generated promises, in particular to do some "cancellation" of ``async`` task represented by ``async function`` or "unsubscribe" callback in construction ``consumer = provider.then(treatSomehow);`` and then write ``consumer.throw(new CancelationError("some reason"))`` instead of writing ``consumer.cancel()`` which might be "controversial" (whether we intend to cancel ``provider`` too, in which form we would like to do that (on which "rail" that cancellation should be delivered? on success-rail, on failure-rail or on some other extra-toxic cancellation-rail)). Ofcourse it can be some very raw tools to do cancellation, but if they were present, any "home made cancellation" would be much more doable and easy to implement then it is now. Regarding ``finally``/``return`` relationship I didn't mean that it is some special feature of generators, instead, ofcourse I first of all check it on regular functions (not only on js but in java too), and for me it was more remarkable that ``return`` can be "replaced" with ``break`` or ``continue`` by the means of ``finally`` block which is more interesting case then replacing ``return`` with ``trow`` or vise versa (which ofcourse also may lead to rather "strange" behavior and rarŅ developer can guess that and/or imagine that strange situation before someone else told him about it). So putting that example with implicit ``return`` <--> ``continue`` replacement I didn't mean to show some "extra" behavior of ``generator.return()`` I only would like to highlight that ``function*`` generators implementation of ``.return`` is QUIT VALID and really simulates ``return`` behavior in place of ``yield`` instruction (without omitting any strange "outcome" on execution flow which ``finally`` block may produce). And it is actually one of key differences with how bluebirdjs cancleation works as follows from [bluebirdjs-cancellation]( http://bluebirdjs.com/docs/api/cancellation.html). There is assumed that cancellation action cause that "only active finally blocks (finally callbacks) are executed" and then cancellation completes (there are no chance to "override" cancellation propagation from finally callbacks in that api) while in "real code" it is possible (and in generators to ...). By the way in flavor of ``Promise.resolve`` and ``Promise.reject`` I would rather "rename" ``Q.deferred`` into ``Promise.never``, in fact it would be almost the same - factory of some promises that never completes it self by its own but rather wait until someone pushes it from outside by the means of abnormal ``.return`` or ``.throw``. Looks may be little bit strange, but describes the thing nicely :)
io.baklan at gmail.com (2017-01-14T21:03:14.941Z)
Actually initial discussion which "inspires" me on this thoughts was in [cancellation-tokens-related](/topic/cancel-promise-pattern-no-cancellable-promises) topic. So here I didn't mean that it is impossible to implement that kind of functionality on "home made" promises. I mean that it would be good to have such functionality to "cancel"/"interrupt" execution flow of natively generated promises, in particular to do some "cancellation" of ``async`` task represented by ``async function`` or "unsubscribe" callback in construction ``consumer = provider.then(treatSomehow);`` and then write ``consumer.throw(new CancelationError("some reason"))`` instead of writing ``consumer.cancel()`` which might be "controversial" (whether we intend to cancel ``provider`` too, in which form we would like to do that (on which "rail" that cancellation should be delivered? on success-rail, on failure-rail or on some other extra-toxic cancellation-rail)). Ofcourse it can be some very raw tools to do cancellation, but if they were present, any "home made cancellation" would be much more doable and easy to implement then it is now. Regarding ``finally``/``return`` relationship I didn't mean that it is some special feature of generators, instead, ofcourse I first of all check it on regular functions (not only on js but in java too), and for me it was more remarkable that ``return`` can be "replaced" with ``break`` or ``continue`` by the means of ``finally`` block which is more interesting case then replacing ``return`` with ``trow`` or vise versa (which ofcourse also may lead to rather "strange" behavior and rear developer can guess that and/or imagine that strange situation before someone else told him about it). So putting that example with implicit ``return`` <--> ``continue`` replacement I didn't mean to show some "extra" behavior of ``generator.return()`` I only would like to highlight that ``function*`` generators implementation of ``.return`` is QUIT VALID and really simulates ``return`` behavior in place of ``yield`` instruction (without omitting any strange "outcome" on execution flow which ``finally`` block may produce). And it is actually one of key differences with how bluebirdjs cancleation works as follows from [bluebirdjs-cancellation]( http://bluebirdjs.com/docs/api/cancellation.html). There is assumed that cancellation action cause that "only active finally blocks (finally callbacks) are executed" and then cancellation completes (there are no chance to "override" cancellation propagation from finally callbacks in that api) while in "real code" it is possible (and in generators to ...). By the way in flavor of ``Promise.resolve`` and ``Promise.reject`` I would rather "rename" ``Q.deferred`` into ``Promise.never``, in fact it would be almost the same - factory of some promises that never completes it self by its own but rather wait until someone pushes it from outside by the means of abnormal ``.return`` or ``.throw``. Looks may be little bit strange, but describes the thing nicely :)
io.baklan at gmail.com (2017-01-14T15:54:39.942Z)
Actually initial discussion which "inspires" me on this thoughts was in [cancellation-tokens-related](/topic/cancel-promise-pattern-no-cancellable-promises) topic. So here I didn't mean that it is impossible to implement that kind of functionality on "home made" promises. I mean that it would be good to have such functionality to "cancel"/"interrupt" execution flow of natively generated promises, in particular to do some "cancellation" of ``async`` task represented by ``async function`` or "unsubscribe" callback in construction ``consumer = provider.then(treatSomehow);`` and then write ``consumer.throw(new CancelationError("some reason"))`` instead of writing ``consumer.cancel()`` which might be "controversial" (whether we intend to cancel provider too, in which form we would like to do that (on which "rail" that cancellation should be delivered? on success-rail, on failure-rail or on some other extra-toxic cancellation-rail)). Ofcourse it can be some very raw tools to do cancellation, but if they were present, any "home made cancellation" would be much more doable and easy to implement then it is now. Regarding ``finally``/``return`` relationship I didn't mean that it is some special feature of generators, instead, ofcourse I first of all check it on regular functions (not only on js but in java too), and for me it was more remarkable that ``return`` can be "replaced" with ``break`` or ``continue`` by the means of ``finally`` block which is more interesting case then replacing ``return`` with ``trow`` or vise versa (which ofcourse also may lead to rather "strange" behavior and rear developer can guess that and/or imagine that strange situation before someone else told him about it). So putting that example with implicit ``return`` <--> ``continue`` replacement I didn't mean to show some "extra" behavior of ``generator.return()`` I only would like to highlight that ``function*`` generators implementation of ``.return`` is QUIT VALID and really simulates ``return`` behavior in place of ``yield`` instruction (without omitting any strange "outcome" on execution flow which ``finally`` block may produce). And it is actually one of key differences with how bluebirdjs cancleation works as follows from [bluebirdjs-cancellation]( http://bluebirdjs.com/docs/api/cancellation.html). There is assumed that cancellation action cause that "only active finally blocks (finally callbacks) are executed" and then cancellation completes (there are no chance to "override" cancellation propagation from finally callbacks in that api) while in "real code" it is possible (and in generators to ...). By the way in flavor of ``Promise.resolve`` and ``Promise.reject`` I would rather "rename" ``Q.deferred`` into ``Promise.never``, in fact it would be almost the same - factory of some promises that never completes it self by its own but rather wait until someone pushes it from outside by the means of abnormal ``.return`` or ``.throw``. Looks may be little bit strange, but describes the thing nicely :)