I would like to argue with the increase in readability - it doesn't
exist.


Promises are an overly verbose "solution" to a simple problem, and are
not an appropriate global replacement for callbacks in every case.
Saying so is misleading and disingenuous.



If you want something universally usable, use callbacks, and let the
consumers of your library wrap them in all the promises they want to.
Wrapping a callback in a promise is less work than taking apart a
promise into a callback, making this the most widely useful approach.



Using solely promises is only going to contribute to the increasing
fragmentation of this community into sects, each revolving around its
(primarily cosmetic) abstractions of choice.



--
Charlie McConnell





On Wed, Apr 16, 2014, at 03:34 AM, willem dhaeseleer wrote:

That fact that node core api's only support callbacks doesn't make them
holy. I understand they used callbacks back in 2009 before
the proliferation  of asynchronous control flow in javascript and the
state of promises in V8 / ECMAScript . But today promises are in V8 and
wildly used and you just can't argue with increase in readability,
maintenance and productivity.
I'm sure we could have a lengthy discussion about what makes a good
api, but I think most people will agree with me that consistency should
be key. Providing both promises and callbacks in your api seems like a
very bad way to go.

The node core API also doesn't really define a standard, it defines an
interface, I believe there are even some methods in the api that don't
even respect the [1]callback(err, result) format.
The standard is ECMAScript, and ECMAScript 6 has promises, and
generators, use them where applicable.







On 16 April 2014 12:02, greelgorke <[2][email protected]> wrote:

my only concern about your post is that you simply ignore the standards
in node. node core apis are callback based, your 3rd party libs should
honor this. a good api doesn't care much about personal opinions and a)
supports the standard and b) provides optional methods for convinience.

it's not about whats better. its about what a good api

Am Mittwoch, 16. April 2014 10:27:18 UTC+2 schrieb willem dhaeseleer:


Hey greelgorke,

Great to get some feedback on my answer, I'll try to clarify my
arguments some more here:

- It always you to pass on asynchronous operations

huh?

 // foo returns promise
 var futureBar = foo();

 // you can know pass around futureBar to some other api or use it for
later reference
 // with callbacks you will have to write your own wrapper code to get
this type of "asynchronous encapsulation"

    - How many types have you typed if (err) throw err or if (err)
console.warn(err) ?

you actually type this yourself?

Off course not, but i have seen it in to much code already.
Obviously i forgot if (err) return callback(err);
If haven't written in this style anymore for a long time.

- Improved readability trough more logical control flow

duh. readability is subjective.

Off course it's subjective, but chronological reading order is
something I tend to value in most code.
Just my opinion.

- Integration with coroutines ( you want this )

huh? how is that connected?

An example should clarify this, this uses bluebird:
This is obviously a bad use of a database, but the idea is to
demonstrate how promises integrate with coroutines.

var getTotalFriendBalance = Promise.coroutine(function* (name) {

    var user, userFriends, x, totalBalance;

    user = yield db.getUserByName(name);

    userFriends = yield db.getFriends([3]user.id);

    for (x = 0; x < userFriends.length; x++) {

        totalBalance += (yield
db.getAccountInfo(userFriends[x].id)).balance;

    }

    return totalBalance;

});


I challenge you to write this peace of code with only callbacks, I
think you will find this syntax is much more intuitive and more
pleasant to write.
This is only possible because all asynchronous methods here return
promises (or thenables) that can be used by the coroutine.

I hope this clarifies my personal opinion on why promises are better.




On Wednesday, April 16, 2014 9:50:22 AM UTC+2, greelgorke wrote:

inline

Am Mittwoch, 16. April 2014 08:46:48 UTC+2 schrieb willem dhaeseleer:


Andrew,

For the love of all that is dear to us, Use promises, do not support
callbacks, don't even think about supporting both.
There is a reason why promises are becoming part of the standard in
ECMA 6.


they are there to give you an alternative, not a replacement. Callbacks
are simple for simpler things. they are the core pattern and they are
accepted. every single person new to node, can just use them, as soon
she understood async coding style.

it is a very bad habbit to only provide promises api. one of the top3
popular modules on npm is async, which handles callbacks.

So, stop crying about callbacks, learn them and provide a cb-based
interface. and stop saying us. :P


Here are a few of many reasons why to choose promises:

- It prevent deep indentation

flatten your code.

- It always you to pass on asynchronous operations

huh?

- Asyncronous callstacks and consistent error handling ( you want this
)
    - How many types have you typed if (err) throw err or if (err)
console.warn(err) ?

you actually type this yourself?

- Refactoring in callback styled code is extremely tedious to the point
where it would be almost reasonable to say it's impossible

it always hard to refactor bad written code either with callbacks,
promises or even synchronous code.

- Improved readability trough more logical control flow

duh. readability is subjective.

- Integration with coroutines ( you want this )

huh? how is that connected?




On Tuesday, April 15, 2014 6:20:05 AM UTC+2, Andrew de Andrade wrote:

So at work we're working on a bunch of node modules that will
eventually be published as open-source and I'm in favor of callbacks
and two of my co-workers are in favor of promises. We've discussed
supporting both API interfaces and I was curious what the general
consensus of the community was with respect to supporting both and the
best way to name functions and methods to support both.

That being said, there are three obvious choices:

(a) two function types: (1) synchronous functions; and (2) async
functions that return promises but also handle callbacks

var value = myFunctionSync();
myFunction(callback);
var promise = myFunction();

this approach has a tiny performance overhead (since you have to check
if the last argument is a function to determine if you should return a
promise or execute that function as the callback) and makes all the
functions a little convoluted (unless you make one higher order
function that you apply to all your callback functions to support both
APIs). Furthermore async, higher order, overloaded functions or
variable arity functions become impossible since you can't necessarily
assume that the last argument is always the callback.

(b) three function types: (1) synchronous functions; (2) async callback
functions; and (3) async promise functions

var value = myFunctionSync();
myFunction(callback);
var promise = myFunctionDeferred();

this is ugly but explicit in terms of what to expect and permits the
most flexibility.

(c) two function types:  (1) synchronous functions; (2) async callback
functions;

var value = myFunctionSync();
myFunction(callback);

and promise support is left up to the user by using a nodeify() method
from a promise library. This is my preference, but won't make my
co-workers happy.


With all this in mind, what's the general consensus of the NodeJS
community on this issue? I searched google and the archives and could
not find any blog posts or discussions that address this particular
issue. What are the pros and cons of each approach? What if any
libraries implement options (a) or (b)? etc.


--
--
Job Board: [4]http://jobs.nodejs.org/
Posting guidelines:
[5]https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [6][email protected]
To unsubscribe from this group, send email to
[7][email protected]
For more options, visit this group at
[8]http://groups.google.com/group/nodejs?hl=en?hl=en

---
You received this message because you are subscribed to a topic in the
Google Groups "nodejs" group.
To unsubscribe from this topic, visit
[9]https://groups.google.com/d/topic/nodejs/NpZ4WT1eOnw/unsubscribe.
To unsubscribe from this group and all its topics, send an email to
[10][email protected].
For more options, visit [11]https://groups.google.com/d/optout.


--

--

Job Board: [12]http://jobs.nodejs.org/

Posting guidelines:
[13]https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines

You received this message because you are subscribed to the Google

Groups "nodejs" group.

To post to this group, send email to [email protected]

To unsubscribe from this group, send email to

[email protected]

For more options, visit this group at

[14]http://groups.google.com/group/nodejs?hl=en?hl=en



---

You received this message because you are subscribed to the Google
Groups "nodejs" group.

To unsubscribe from this group and stop receiving emails from it, send
an email to [15][email protected].

For more options, visit [16]https://groups.google.com/d/optout.

References

1. http://nodejs.org/api/fs.html#fs_fs_exists_path_callback
2. mailto:[email protected]
3. http://user.id/
4. http://jobs.nodejs.org/
5. https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
6. mailto:[email protected]
7. mailto:nodejs%[email protected]
8. http://groups.google.com/group/nodejs?hl=en?hl=en
9. https://groups.google.com/d/topic/nodejs/NpZ4WT1eOnw/unsubscribe
  10. mailto:[email protected]
  11. https://groups.google.com/d/optout
  12. http://jobs.nodejs.org/
  13. https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
  14. http://groups.google.com/group/nodejs?hl=en?hl=en
  15. mailto:[email protected]
  16. https://groups.google.com/d/optout

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to