一些困扰我和我同事的事情。考虑以下几点..。
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]);
如你所料,1,2和3的棕褐色是输出的,解决3,4和5的承诺也是如此。但我的问题是…为什么第三个破了?为什么Promise.resolve的行为方式与其他函数不同?
[ 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)
发布于 2017-07-20 09:09:42
Promise.resolve
指的是没有上下文对象的resolve
函数。
您希望使用适当的上下文对象来调用它。这是可以做到的
v => Promise.resolve(v)
中,或者Promise.resolve.bind(Promise)
中所以,这样做是可行的:
compose(
console.log,
map(Promise.resolve.bind(Promise))
)([7,8,9]);
记住Javascript没有类。功能没有所有者。对象可以在其属性中存储函数,但这并不意味着该函数属于该对象。
另一种方法是使用Function#call
或Function#apply
显式地设置上下文对象。
function (v) {
var resolve = Promise.resolve;
return resolve.call(Promise, v);
}
也许最好把注意力放在方法以外的东西上:
function Foo() {
this.bar = {some: "value"};
this.baz = function () { return this.bar; };
}
var f = new Foo();
var b = f.bar;
var z = f.baz;
在这里,b
引用没有{some: "value"}
的{some: "value"}
,神奇地“知道”f
存储了对它的引用。这应该是显而易见的。
z
也是如此。它存储一个函数,而不知道f
也引用它。理论上,这也应该是显而易见的。
调用z()
将产生与调用f.baz()
不同的结果,即使被调用的函数是相同的。只有上下文是不同的。
发布于 2017-07-20 09:08:42
当一个函数被调用其this variable is dynamically allocated a value时。
resolve
函数关心这个值是什么。
代码的第三部分传递resolve
函数,然后在没有Promise
对象上下文的情况下调用它。
这意味着this
没有得到函数所需的Promise
值。
发布于 2017-07-20 09:09:20
Promise.resolve
需要被调用,this
是一个承诺构造函数(或子类)。
resolve = Promise.resolve;
resolve(null); // Error
resolve.call({}); // Error: Object is not a constructor
因此,请更改这一行:
map(Promise.resolve)
至:
map(Promise.resolve.bind(Promise))
https://stackoverflow.com/questions/45210122
复制相似问题