javascript - 简单的初学者承诺链
问题描述
我是编程和 Javascript 的新手,最近通过我的工作培训计划发现了一个问题,但目前似乎没有人有足够的解决方案。
- 使用 syncThen 方法编写您自己的 Promise 类。例子:
let promise = new MyPromise((resolve) => {
console.log(1);
resolve();
}).synchThen(() => {
console.log(2);
}).then(() => {
console.log(3);
})
console.log(4);
//1, 2, 4, 3
- 编写 ReversePromise 类,以便“then”函数从头到尾调用
。
例子:
let promise = new ReversePromise((resolve) => {
console.log(1);
resolve();
})
.then(() => console.log(2))
.then(() => console.log(3))
.then(() => console.log(4))
//1, 4, 3, 2
我花了大约一周的时间浏览文档,所以我了解了 Promise 的基础知识,我想知道的是如何创建 syncThen 方法作为链接到 then() 函数的一种方式?
第一部分很好...
const promise = new Promise(function(resolve, reject) {
console.log(1);
setTimeout(() => resolve(4), 1000);
}).then(function(result){
console.log(result);
});
console.log(2);
它显示日志 1、2、4,我明白为什么,但不确定如何链接 syncThen 方法?
编辑...
我现在刚刚为后续的 then 方法使用了链接,而且它都很简单,但是问题所要求的 asyncThen 方法就像相反的位一样抛出了我。
再次附加代码
console.log(1);
new Promise(function(resolve, reject) {
resolve(4);
})
.then(result => {
console.log(result);
return new Promise(function(resolve, reject) {
resolve(3);
});
})
.then(result => {
console.log(result);
})
console.log(2);
我认为使用 asyncThen 函数,他们想要一个方法,我可以在其中传递返回的 promise 并对其进行操作,然后在 then () 之前或之后链接
解决方案
// index.js
class MyPromise extends Promise {
syncThen(fn) {
const val = fn();
return this.then(_ => val);
}
}
exports.MyPromise = MyPromise;
// NEVER EVER WRITE A PROGRAM LIKE THIS!
// REVERSE PROMISE IS THE SILLIEST
// IDEA I HAVE EVER HEARD OF.
// IF YOU WRITE CODE LIKE THIS
// YOUR TEAMMATES WILL NOT LIKE YOU.
class ReversePromise extends Promise {
constructor(fn) {
super(_ => _());
this.fn = fn;
this.stack = [];
}
then(fn) {
this.stack.push(fn);
return this;
}
// not standard to promises
// but you need some way to
// say the chaining has completed
run() {
const p = new Promise(this.fn);
let current = p;
while (this.stack.length) {
current = current.then(this.stack.pop());
}
return p;
}
}
exports.ReversePromise = ReversePromise;
像这样调用:
const { MyPromise, ReversePromise } = require('.');
const myP = (new MyPromise(res => {console.log(1); res()})).syncThen(_ => console.log(2)).then(_ => console.log(3)); console.log(4);
const revP = (new ReversePromise(res => { console.log(1); res();})).then(_ => console.log(2)).then(_ => console.log(3)).then(_ => console.log(4)).run();