EcmaScript Proposal - Promised functions
kai zhu
kaizhu256 at gmail.com
Thu Apr 12 18:03:19 UTC 2018
or ... you could bypass these low-level promise-abstractions altogether, and elegantly solve the actual integration-level task asked by your pm - with a single, easy-to-debug, throwaway recursive-callback (which will likely work exactly the same 10 years from now, while god-knows how the magic will evolve with promises in that time).
```javascript
/*
* example.js
*
* example usage:
* $ FOR_HOW_LONG=1000 node example.js
*
* example output:
* 0 ms - start recusive-callback
* 1005 ms - waited for server and db to initialize
* 1007 ms - read file example.js which had 2519 characters
* 1844 ms - fetched 1270 bytes of data from https://www.example.com
* 1844 ms - finished recursive-callback
*/
/*jslint
bitwise: true,
browser: true,
maxerr: 4,
maxlen: 100,
node: true,
nomen: true,
regexp: true,
stupid: true
*/
'use strict';
var modeNext, onNext, timeStart, tmp;
onNext = function (error, data) {
// For reject:
if (error) {
console.error(error);
return;
}
modeNext += 1;
switch (modeNext) {
case 1:
timeStart = Date.now();
console.log((Date.now() - timeStart) + ' ms - ' +
'start recusive-callback');
// sleep
setTimeout(onNext, process.env.FOR_HOW_LONG);
break;
case 2:
console.log((Date.now() - timeStart) + ' ms - ' +
'waited for server and db to initialize');
onNext();
break;
case 3:
// read this file
require('fs').readFile(__filename, 'utf8', onNext);
break;
case 4:
console.log((Date.now() - timeStart) + ' ms - ' +
'read file ' + __filename + ' which had ' + data.length + ' characters');
onNext();
break;
case 5:
// fetch data from https://www.example.js
require('https').request(
require('url').parse('https://www.example.com'),
function (response) {
onNext(null, response);
}
)
// handle http-request error
.on('error', onNext)
.end();
break;
case 6:
// handle http-response error
data.on('error', onNext);
// collect http-response chunks
tmp = [];
data.on('data', function (chunk) {
tmp.push(chunk);
});
// concatenate http-response chunks
data.on('end', function () {
onNext(null, Buffer.concat(tmp));
});
break;
case 7:
console.log((Date.now() - timeStart) + ' ms - ' +
'fetched ' + data.length + ' bytes of data from https://www.example.com');
onNext();
break;
case 8:
console.log((Date.now() - timeStart) + ' ms - ' +
'finished recursive-callback');
break;
}
};
modeNext = 0;
onNext();
```
> On 13 Apr 2018, at 12:07 AM, Luiz Felipe Frazão Gonçalves <luizfelipefrazaogoncalves at gmail.com> wrote:
>
> One new proposal for EcmaScript.
>
> Promised Functions
>
> Like async/await, the promised functions would be preceded by a keyword. In the case, promised, it would change the default behavior of the function, making it behave as a promise.
>
> I will use as an example a classic sleep function:
>
> function sleep(forHowLong) {
> return new Promise((resolve, reject) => {
> setTimeout(function() {
> resolve();
>
> /**
> * For reject:
> *
> * reject(Error('Some error'));
> */
> }, forHowLong);
> });
> }
> I think to avoid the huge amount of callbacks, there should be a syntax similar to this:
>
> promised function sleep(forHowLong) {
> setTimeout(function() {
> this.resolve(); // could even create a keyword like "resolve"
>
> /**
> * For reject:
> *
> * this.reject(Error('Some error'));
> */
> }, forHowLong);
> }
> Note that the hypothetical keyword "promised" before the function statement makes it act as a promise.
>
> Just a crazy idea I had. :)
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
> On 13 Apr 2018, at 12:19 AM, Tab Atkins Jr. <jackalmage at gmail.com> wrote:
>
> On Thu, Apr 12, 2018 at 9:07 AM, Luiz Felipe Frazão Gonçalves
> <luizfelipefrazaogoncalves at gmail.com <mailto:luizfelipefrazaogoncalves at gmail.com>> wrote:
>> One new proposal for EcmaScript.
>>
>> Promised Functions
>>
>> Like async/await, the promised functions would be preceded by a keyword. In
>> the case, promised, it would change the default behavior of the function,
>> making it behave as a promise.
>>
>> I will use as an example a classic sleep function:
>>
>> function sleep(forHowLong) {
>> return new Promise((resolve, reject) => {
>> setTimeout(function() {
>> resolve();
>>
>> /**
>> * For reject:
>> *
>> * reject(Error('Some error'));
>> */
>> }, forHowLong);
>> });
>> }
>>
>> I think to avoid the huge amount of callbacks, there should be a syntax
>> similar to this:
>
> Some of these callbacks aren't necessary:
>
> function sleep(forHowLong) {
> return new Promise(resolve=>setTimeout(resolve, forHowLong));
> }
>
> Tho even if you do use all the same callbacks, just formatting it
> properly helps:
>
> function sleep(forHowLong) {
> return new Promise(resolve=>setTimeout(_=>resolve(), forHowLong));
> }
>
> ~TJ
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
> https://mail.mozilla.org/listinfo/es-discuss <https://mail.mozilla.org/listinfo/es-discuss>
> On 13 Apr 2018, at 1:55 AM, Michał Wadas <michalwadas at gmail.com> wrote:
>
> Is it codyfing of glorious The Deferred anti-pattern? https://github.com/petkaantonov/bluebird/wiki/Promise-Anti-patterns#the-deferred-anti-pattern <https://github.com/petkaantonov/bluebird/wiki/Promise-Anti-patterns#the-deferred-anti-pattern>
>
> On Thu, Apr 12, 2018 at 6:07 PM, Luiz Felipe Frazão Gonçalves <luizfelipefrazaogoncalves at gmail.com <mailto:luizfelipefrazaogoncalves at gmail.com>> wrote:
> One new proposal for EcmaScript.
>
> Promised Functions
>
> Like async/await, the promised functions would be preceded by a keyword. In the case, promised, it would change the default behavior of the function, making it behave as a promise.
>
> I will use as an example a classic sleep function:
>
> function sleep(forHowLong) {
> return new Promise((resolve, reject) => {
> setTimeout(function() {
> resolve();
>
> /**
> * For reject:
> *
> * reject(Error('Some error'));
> */
> }, forHowLong);
> });
> }
> I think to avoid the huge amount of callbacks, there should be a syntax similar to this:
>
> promised function sleep(forHowLong) {
> setTimeout(function() {
> this.resolve(); // could even create a keyword like "resolve"
>
> /**
> * For reject:
> *
> * this.reject(Error('Some error'));
> */
> }, forHowLong);
> }
> Note that the hypothetical keyword "promised" before the function statement makes it act as a promise.
>
> Just a crazy idea I had. :)
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
> https://mail.mozilla.org/listinfo/es-discuss <https://mail.mozilla.org/listinfo/es-discuss>
>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20180413/58caa362/attachment-0001.html>
More information about the es-discuss
mailing list