Something that is bugging me and my colleague. Consider the following...
const {map, compose} = require('ramda');
compose(
console.log,
map(Math.tan)
)([1,2,3]);
compose(
console.log,
map(v=>Promise.resolve(v))
)([4,5,6]);
compose(
console.log,
map(Promise.resolve)
)([7,8,9]);
As you would expect, the tan of 1, 2 and 3 are output and so are the promises resolving 3, 4 and 5. But my question is... why does the third break? Why doesn't Promise.resolve behave in the same way as any other function?
[ 1.5574077246549023, -2.185039863261519, -0.1425465430742778 ]
[ Promise { 4 }, Promise { 5 }, Promise { 6 } ]
/home/xxx/node_modules/ramda/src/internal/_map.js:6
result[idx] = fn(functor[idx]);
^
TypeError: PromiseResolve called on non-object
at resolve (<anonymous>)
at _map (/home/xxx/node_modules/ramda/src/internal/_map.js:6:19)
at map (/home/xxx/node_modules/ramda/src/map.js:57:14)
at /home/xxx/node_modules/ramda/src/internal/_dispatchable.js:39:15
at /home/xxx/node_modules/ramda/src/internal/_curry2.js:20:46
at f1 (/home/xxx/node_modules/ramda/src/internal/_curry1.js:17:17)
at /home/xxx/node_modules/ramda/src/internal/_pipe.js:3:27
at /home/xxx/node_modules/ramda/src/internal/_arity.js:5:45
at Object.<anonymous> (/home/xxx/b.js:20:6)
at Module._compile (module.js:569:30)
Promise.resolve
refers to theresolve
function without context object.You want to call it with the proper context object. This can be done
v => Promise.resolve(v)
, orPromise.resolve.bind(Promise)
So, this would work:
Remember that Javascript does not have classes. Functions have no owner. Objects can store functions in their properties, but that does not mean the function is owned by that object.
Another way is setting the context object explicitly, with
Function#call
orFunction#apply
:Maybe it's best illustrated by focusing on something other than a method:
here
b
refers to{some: "value"}
without{some: "value"}
magically "knowing" thatf
stores a reference to it. This should be obvious.The same is true of
z
. It stores a function without that function "knowing" thatf
also references it. This should be just as obvious, in theory.Calling
z()
will yield different results than callingf.baz()
, even though the called function is the same one. Only the context is different.Promise.resolve
needs to be called withthis
being a Promise constructor (or subclass).So change this line:
to:
When a function is called its this variable is dynamically allocated a value.
The
resolve
function cares what that value is.The third part of your code passes the
resolve
function and then calls it without the context of thePromise
object.This means that
this
does not get allocated the value ofPromise
which the function needs.