当前位置: 首页 > 知识库问答 >
问题:

简单promise再落实

贺宏富
2023-03-14

最近,在一次全栈开发人员面试中,我看到了一段被问到的代码。它包括创建一个Promise(候选人应该在其中实现)、传递一个resolve函数,以及链接2 then的。

我非常天真地尝试实现promise,只是为了让代码工作。创建了一个接受解析器函数的ctor,创建了一个接受回调并返回promise的Then函数,并简单地对解析器函数调用回调。

class MyPromise {

    constructor(resolver) {
        this.resolver = resolver;
    }

    then(callback) {
        const result = new MyPromise(callback);
        this.resolver(callback);

        return result;
    }
}

promise = new MyPromise(
    (result) => {
        setTimeout(result(2), 500);
    });
promise.then(result => {
    console.log(result);
    return 2 * result;
}).then(result => console.log(result));

预期的结果是2,4-就像用真正的promise操作一样。但我得到了2,2。我很难弄清楚如何获取第一个“then”的返回值并传递它。

共有1个答案

司寇瑾瑜
2023-03-14

下面是创建promise类的缩短代码,

class MyPromise {
  constructor(executor) {
    this.callbacks = [];

    const resolve = res => {
      for (const { callback } of this.callbacks) {
        callback(res);
      }
    };

    executor(resolve);
  }

  then(callback) {
    return new MyPromise((resolve) => {
      const done = res => {
        resolve(callback(res));
      };
      this.callbacks.push({ callback: done });
    });
  }
}


promise = new MyPromise((resolve) => {
  setTimeout(() => resolve(2), 1000);
});

promise.then(result => {
  console.log(result);
  return 2 * result;
}).then(result => console.log(result));
 类似资料:
  • 我的循环视图滚动太慢了。当我通过触摸Recyclerview开始滚动时,它会滞后,但当从上方的视图开始滚动时不会滞后。我还禁用了recyclerview上的嵌套滚动。 这是我的布局: 这是一个滞后的视频。就像滚动跳过了一些布局。

  • 本文向大家介绍如何简单的实现一个promise?相关面试题,主要包含被问及如何简单的实现一个promise?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先明确什么是promiseA+规范,参考规范的地址:primise A+规范 如何实现一个promise,参考我的文章: 实现一个完美符合Promise/A+规范的Promise 一般不会问的很详细,只要能写出上述文章中的v1.0版本

  • We had a little usability problem in CityDesk. 我们的CityDesk遇到了一些小的可用性问题。 Here was the problem: you could import files from the web using a menu command ("Import Web Page"). And you could import files f

  • 本文向大家介绍简单实现异步编程promise模式,包括了简单实现异步编程promise模式的使用技巧和注意事项,需要的朋友参考一下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的回调函数,没有阻塞其他代码的执行。还有像setTimeout方法同样也是异步执行回

  • 本文向大家介绍js使用Promise实现简单的Ajax缓存,包括了js使用Promise实现简单的Ajax缓存的使用技巧和注意事项,需要的朋友参考一下 业务场景 在不少业务场景下,我们需要实现简单的请求缓存(即某个请求只发起一次请求),例如上传 Token 的获取、获取配置的接口等。 这些接口可以通过 Promise 实现简单的缓存并能够控制更新,而不需要另外引入缓存层。 示范代码 用七牛上传作例

  • 本文向大家介绍手写简单的jQuery雪花飘落效果实例,包括了手写简单的jQuery雪花飘落效果实例的使用技巧和注意事项,需要的朋友参考一下 前言 最近闲来无事,准备写个雪花飘落的效果,没有写太牛逼的特效,极大的简化了代码量,这样容易读取代码,用起来也很简单,对于那些小白简直是福利啊,简单易读易学。先直接上代码吧,然后再一一讲解,直接复制粘贴就可以拿来用了,改起来更是容易。 上面是代码,是不是很简单