微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用偏函数检索值

如何解决如何使用偏函数检索值

我有以下代码

const PENDING = 'PENDING';
const FULFILLED = 'FULFILLED';
const REJECTED = 'REJECTED';

class simplePromise {
  
  constructor(callback) {
    this.state = PENDING;
    this.value = null;
    // here so I can execute all the functions
    this.handlers = [];
    this.doResolve(callback,this.resolve.bind(this),this.reject.bind(this));
  }

  doResolve(callback,onResolved,onRejected) {
    let done = false;
    console.log(callback,'callback')
    callback((val) => {
      console.log(val,'val')
      if (done) return;
      done = true;
      onResolved(val)
    })
  }

  resolve(val) {
    this.state = FULFILLED;
    this.value = val;
    this.handlers.forEach(handler => handler);
  }

  reject(error) {
    this.state = REJECTED;
    this.value = error;
    this.handlers.forEach(handler => handler);
  }
}


const promiseA = new simplePromise( (resolutionFunc,rejectionFunc) => {
  resolutionFunc(777);
});

令我困惑的是以下几行:

callback((val) => {
      console.log(val,'val')

val 的值正确为 777。但是,我不明白为什么。根据我的理解,我最初传入的是一个带2个参数的回调函数,所以我认为val的值应该是

(resolutionFunc,rejectionFunc) => {
  resolutionFunc(777);
}

在这种情况下它如何正确地计算出777的值?

解决方法

这是一个很好的问题......而且我需要紧张地尝试一个明确的答案。我担心必须编辑 400 次才能改进初稿。希望它仍然是一个草稿,但足以在之后加入一些更深入的教程。


首先,这确实是一个simplePromise,因为它不能被拒绝。

您正确识别了此处称为 callback 的内容...这是传递给 simplePromise 实例的函数。

现在注意在promise构造函数中,有一个函数调用:

this.doResolve(callback,this.resolve.bind(this),this.reject.bind(this));

其中 callback 作为第一个参数传递,另一个参数分别是定义为类方法的 resolvereject 函数。 doResolve 在承诺实例化时立即执行。

因此执行 doResolvecallback 被调用...再次将函数作为第一个参数传递给它:

(val) => {
  console.log(val,'val')
  if (done) return;
  done = true;
  onResolved(val)
}

该函数实际上是提供给 promise 的 resolutionFunccallback 参数!

太好玩了...太好玩了...

留在我身边!所以我们仍然处于 callback 执行阶段......我们用 resolutionFunc 作为参数调用 777。我们也可以传入一个 rejectionFunc 函数。

这就是我们最终执行的地方:

(val) => {
  console.log(val,'val')
  if (done) return;
  done = true;
  onResolved(val)
}

这就是为什么控制台日志记录 val 输出 777...它从来没有去其他地方。它是直接从 resolutionFunc(777) 传递过来的。

那么它是不是只是一堆函数作为函数传递来调用自己?简而言之?

是的...但它有一个优势。承诺“结构”的优点是拥有一整套更复杂的功能,否则将在 class 中重复,并且只传递“真实用例”更改部分({{ 1}}).

它允许在编程时将重复的机制排除在其他逻辑之外。

还有一个绑定到实例的对象,特别是 callback 可以使用的 state.done() 等等......所以一些更复杂的逻辑可以使用对象。

这个过于简单的承诺中缺少什么......除了原封不动地返回提供的值之外,是否真的在做一些事情。它可能是一个检查它是否是一个数字......或者服务器响应检查,例如,如果你考虑 Ajax。


下面,我只是添加了一些带有数字的控制台日志......所以你可以注意到执行的顺序。 ;)

.fail()


为什么 const PENDING = 'PENDING'; const FULFILLED = 'FULFILLED'; const REJECTED = 'REJECTED'; class simplePromise { constructor(callback) { this.state = PENDING; this.value = null; // here so I can execute all the functions this.handlers = []; this.doResolve(callback,this.reject.bind(this)); } doResolve(callback,onResolved,onRejected) { console.log("1") console.log(callback) let done = false; callback((val) => { console.log("2") if (done) return; done = true; onResolved(val) }) } resolve(val) { console.log("3") this.state = FULFILLED; this.value = val; this.handlers.forEach(handler => handler); } reject(error) { console.log("4") this.state = REJECTED; this.value = error; this.handlers.forEach(handler => handler); } } const promiseA = new simplePromise( (resolutionFunc,rejectionFunc) => { console.log("5") console.log(resolutionFunc) resolutionFunc(777); });5 之前被记录?

因为 2 位于作为参数传递的函数语句中。然后在 console.log("2")

之后立即在 callback 内部调用该函数

console.log("5") 是:

resolutionFunc

关键是要注意何时调用函数语句。我在代码段中添加了两个控制台日志......希望能让它变得明显。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。