javascript – 为什么不能将Promise.resolve作为函数调用?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 为什么不能将Promise.resolve作为函数调用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2134字,纯文字阅读大概需要4分钟。
内容图文
有些东西让我和我的同事烦恼.考虑以下…
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)
解决方法:
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()不同的结果,即使被调用的函数是相同的.只有背景不同.
内容总结
以上是互联网集市为您收集整理的javascript – 为什么不能将Promise.resolve作为函数调用?全部内容,希望文章能够帮你解决javascript – 为什么不能将Promise.resolve作为函数调用?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。