如何解决如何使用偏函数检索值
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
作为第一个参数传递,另一个参数分别是定义为类方法的 resolve
和 reject
函数。 doResolve
在承诺实例化时立即执行。
因此执行 doResolve
,callback
被调用...再次将函数作为第一个参数传递给它:
(val) => {
console.log(val,'val')
if (done) return;
done = true;
onResolved(val)
}
该函数实际上是提供给 promise 的 resolutionFunc
的 callback
参数!
太好玩了...太好玩了...
留在我身边!所以我们仍然处于 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 举报,一经查实,本站将立刻删除。