首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不能将Promise.resolve作为函数调用?

为什么不能将Promise.resolve作为函数调用?
EN

Stack Overflow用户
提问于 2017-07-20 09:04:03
回答 3查看 5.7K关注 0票数 8

一些困扰我和我同事的事情。考虑以下几点..。

代码语言:javascript
运行
复制
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的行为方式与其他函数不同?

代码语言:javascript
运行
复制
[ 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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-20 09:09:42

Promise.resolve指的是没有上下文对象的resolve函数。

您希望使用适当的上下文对象来调用它。这是可以做到的

  • 通过在上下文对象上调用它,如在v => Promise.resolve(v)中,或者
  • 通过创建它的绑定版本,如在Promise.resolve.bind(Promise)

所以,这样做是可行的:

代码语言:javascript
运行
复制
compose(
  console.log,
  map(Promise.resolve.bind(Promise))
)([7,8,9]);

记住Javascript没有类。功能没有所有者。对象可以在其属性中存储函数,但这并不意味着该函数属于该对象。

另一种方法是使用Function#callFunction#apply显式地设置上下文对象。

代码语言:javascript
运行
复制
function (v) {
    var resolve = Promise.resolve;
    return resolve.call(Promise, v);
}

也许最好把注意力放在方法以外的东西上:

代码语言:javascript
运行
复制
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()不同的结果,即使被调用的函数是相同的。只有上下文是不同的。

票数 23
EN

Stack Overflow用户

发布于 2017-07-20 09:08:42

当一个函数被调用其this variable is dynamically allocated a value时。

resolve函数关心这个值是什么。

代码的第三部分传递resolve函数,然后在没有Promise对象上下文的情况下调用它。

这意味着this没有得到函数所需的Promise值。

票数 2
EN

Stack Overflow用户

发布于 2017-07-20 09:09:20

Promise.resolve需要被调用,this是一个承诺构造函数(或子类)。

代码语言:javascript
运行
复制
resolve = Promise.resolve;
resolve(null); // Error
resolve.call({}); // Error: Object is not a constructor

因此,请更改这一行:

代码语言:javascript
运行
复制
map(Promise.resolve)

至:

代码语言:javascript
运行
复制
map(Promise.resolve.bind(Promise))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45210122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档