首页 > 解决方案 > 简单的初学者承诺链

问题描述

我是编程和 Javascript 的新手,最近通过我的工作培训计划发现了一个问题,但目前似乎没有人有足够的解决方案。

  1. 使用 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
    
  1. 编写 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 () 之前或之后链接

标签: javascript

解决方案


// 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();

推荐阅读