5 ms·
Curry flavored promises
- gberger 13y ago//here's an AJAX request and a chain of promises m.request({method: "GET", url: "/api/projects"}) .then(console.log) // log all projects .then(pastItems) // filter past projects .then(console.log) // log past projects only The calls to console.log will not work. You need to do this: .then(function() { console.log(arguments); }) Or this: .then(console.log.bind(console))
- gonzoisme 13y agoYeah, the example couldn't work. Also, isn't this an example of partial application, not currying?
- ephemeralgomi 13y agoYup.
- judk 13y agoFunny this mistake rarely goes the other direction. Probably because 'curry' is a fin word. I propose 'parry' for "partial application", to satisfy the punsters without compromising accuracy.
- _ZeD_ 13y agowell, it depends on the console.log implementation :) On firefox I get >>> console.log.call(undefined, "Hi") Hi
- bendrucker 13y agoconsole.log is bound in Firefox and in Node. In all other browsers calling console.log.call(null) is a TypeError.
- cwmma 13y agothis console.log.bind(console) doesn't work in old IE you need to do Function.prototype.bind.call(console.log, console)
- anaphor 13y ago>Currying is a functional programming technique that lets us pre-define arguments in a function No it isn't, that's partial application. Currying is (lambda (a b c) ...) => (lambda (a) (lambda (b) (lambda (c) ...))) generalized to any number of parameters.
- reddyonrails 13y agototal_sum = total.curry sum_of_cubes = total_sum.(lambda { |x| x^3} ) sum_of_cubes.(1,2) In ruby way
- bilalq 13y agoDo these promises work differently from most other implementations? Just sticking a `.then(console.log)` seems like it would yield `undefined` to the next function in the promise chain, no?
- esailija 13y agoMaybe the code was untested or only tested in firefox or node, where `console.log` is bound (which is sane default for singletons if you ask me)
- bendrucker 13y agoIt's true that console.log is bound in FF and Node but that s not the issue here. Passing console.log to then will cause the next handler to receive the return value of the console.log call, i.e. undefined.
- esailija 13y agoIn mithril promises if you return undefined from then, the promise will fulfill with the previous value, I.E. it behaves like .tap in other promise libraries (because doing this in a .then like mithril does violates the spec - which is evidently surprising) However, with unbound console.log the code doesn't work at all, this is the case in Chrome for example.
- bendrucker 13y agoThe breaks from A+ are pretty serious, both the treatment of undefined and releasing zalgo (http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony http://blog.izs.me/post/59142742143/designing-apis-for-async...) and calling it a feature. Not on the hunt for a client side micro-framework but since I use a lot of modules that supply promises there's no way I'd use this.
- phpnode 13y agoagree, this sounds like a bug, console.log() returns undefined so that's what the next promise in the chain should receive.
- lhorie 13y agoHi author here. Thanks for the feedback! Just wanted to clarify some points: I should probably have noted that the usage of console.log is illustrative and is typically only used for debugging (the idea being that console.log could be used in Firefox, or you could wrap it in a log helper function, or use alert or whatever). Typically, in a Mithril app, you'd either assign the promise to a variable or bind to an m.prop at the end of the chain, as per the docs on web services ( http://lhorie.github.io/mithril/web-services.html http://lhorie.github.io/mithril/web-services.html ) Regarding console.log returning undefined: Mithril does deviate from A+ promises (again, as per the docs - http://lhorie.github.io/mithril/mithril.deferred.html http://lhorie.github.io/mithril/mithril.deferred.html ). The reason for the spec deviation is precisely to allow the use case of mixing procedural impurity into a chain (whereas the undefined case covered by the spec isn't really useful, given that undefined is the lack of a value, as opposed to null, which is a value with no meaning). @anaphor: huh, reading about currying again, you're right. Little misunderstanding on my part. Sorry about that.
- anaphor 13y agoThat's okay, I've seen people with PhDs confuse them before, it's a common mistake, and currying gets you partial application "for free". Good article nevertheless!