为什么Promise.resolve不能被称为函数?

时间:2017-07-20 09:04:04

标签: javascript functional-programming promise ramda.js

让我和我的同事烦恼的事情。请考虑以下内容......

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)

3 个答案:

答案 0 :(得分:14)

public function postLogin(Request $request) { dd(session('cart')); // validate // attempt to log in } 指的是没有上下文对象的Promise.resolve函数

您想使用正确的上下文对象调用它。这可以做到

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

所以,这样可行:

Promise.resolve.bind(Promise)

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

另一种方法是使用compose( console.log, map(Promise.resolve.bind(Promise)) )([7,8,9]); 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()不同的结果,即使被调用的函数是相同的。只有背景不同。

答案 1 :(得分:2)

当一个函数被称为this variable is dynamically allocated a value时。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.min.js"></script> <script src="https://flaviusmatis.github.io/simplePagination.js/jquery.simplePagination.js"></script> <link href="https://flaviusmatis.github.io/simplePagination.js/simplePagination.css" rel="stylesheet"> <div id="light-pagination" class="pagination light-theme simple-pagination"></div> <div id="posts"></div> <script id="post-template" type="text/x-handlebars-template"> <div class="score-structural score-column2-wideright search-listings post"> <div class="score-right"> <h4>{{record_count}}</h4> <h5 style="z-index: 1;"> <a href="#"> {{ title }} </a> </h5> <p style="z-index: 1;"> {{ desc }} </p> </div> </div> </script>函数关心该值是什么。

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

这意味着Promise没有分配函数所需的this值。

答案 2 :(得分:1)

需要使用Promise.resolve作为Promise构造函数(或子类)来调用

this

resolve = Promise.resolve;
resolve(null); // Error
resolve.call({}); // Error: Object is not a constructor

所以改变这一行:

map(Promise.resolve)

为:

map(Promise.resolve.bind(Promise))