Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 简单乞丐承诺链_Javascript - Fatal编程技术网

Javascript 简单乞丐承诺链

Javascript 简单乞丐承诺链,javascript,Javascript,我是编程和Javascript的新手,最近通过我的works培训计划发现了一个问题,但到目前为止,似乎还没有人找到合适的解决方案 使用syncThen方法编写自己的Promise类。 例子: 编写ReversePromise类,以便“then”函数从一端调用到另一端 开始。 例子: 我花了一周左右的时间浏览了文档,了解了承诺的基本知识,我想知道的是如何创建syncThen方法作为链接到then函数的方法 第一部分很好 const promise=新的允诺函数解析、拒绝{ console.log

我是编程和Javascript的新手,最近通过我的works培训计划发现了一个问题,但到目前为止,似乎还没有人找到合适的解决方案

使用syncThen方法编写自己的Promise类。 例子: 编写ReversePromise类,以便“then”函数从一端调用到另一端 开始。 例子: 我花了一周左右的时间浏览了文档,了解了承诺的基本知识,我想知道的是如何创建syncThen方法作为链接到then函数的方法

第一部分很好


const promise=新的允诺函数解析、拒绝{ console.log1; setTimeout=>Resolve41000; }.Then函数结果{ console.logresult; }; console.log2 //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();

louisbuchbinder已经处理了ReversePromise实现。不过,我不确定这个答案中我的承诺是否真的有效

下面是MyPromise的一个版本及其同步方法。它使用委托而不是继承。synchThen方法除了写入控制台等副作用外,是完全无用的。我们无法对promise结果执行任何操作,因为这是同步运行的,并且结果尚未计算。计算结果的进程也不能利用此函数的任何返回,因为它已经停止了异步进程

所以这和反向预测一样愚蠢。但它确实显示了实现这一目标的一种方法

const MyPromise=类{ 构造函数回调{this.promise=新承诺回调} 那么fn{this.promise.thenfn;返回这个} 同步fn{fn;返回此} } const promise=new mypromisersolve=>{ 控制台日志1 决定 }.synchThen=>{ 控制台2.log2 }.然后=>{ 控制台日志3 }
console.log4同步从何而来?听起来像是async的混搭,然后…MyPromise在构造函数中接收回调。我认为,在构造函数中,您应该创建一个本机承诺,并将回调传递给它。此类的实例有一个syncThen方法。它接收一个函数作为回调和返回承诺。您可以将此回调链接到您在构造函数中创建的承诺。const Promise=new Promisefunctionresolve,拒绝{console.log1;setTimeout=>resolve2,1000;}。然后函数结果{console.logresult;}。然后=>{console.log4;}。然后=>{console.log3;}@digitaldriver老实说,我不知道,我刚问了一个似乎很模糊的问题。Mosh Feu,谢谢,我会研究一下:。我对这篇文章的理解是,syncThen将是它听起来的样子。它接受回调并同步调用它,而不等待结果被知道。我假设它的结果被丢弃了。作为一个学习练习,这可能会很有趣。但是我不认为它实际上对任何事情都有用。ReversePromise是如此愚蠢,我建议根本不要使用它+仅警告一条:-这绝对是太棒了,我刚刚开始学习stack,在我得到>15分之前,我无法给你投票。但这非常有帮助,不用担心,我不会在现实世界中使用哈哈。我的计划是花大量时间学习vanilla js,提高效率,然后进入react框架,我还学习leetcode问题,因为它帮助我进行逻辑思考。关于如何成为一名更好的开发人员,您有什么建议吗?再次感谢你的回复。我认为从香草js开始是一个很好的方式。花些时间学习nodejs核心库也是值得的。编程就像其他任何事情一样,你需要花点时间来做得更好。我可以说这很愚蠢,但很好的任务和工作路易斯学习承诺和一些更高级的javascript,非常好的练习,我想即使是一些中间人也会遇到一些困难。顺便说一句,jacob,学习打字脚本更像是帮助你在大项目中保持打字这很有帮助很多,似乎是一个非常优雅的版本,我试图去,感谢这一点,我知道我应该使用syncThen来回报承诺,但不知道如何。
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();