如何延迟在Promise中排除代码?

时间:2017-08-14 15:28:29

标签: javascript

我的代码:



class MyPromise extends Promise {
  constructor(func) {
    super(func);
  }
  SomePromiseExtensionMethod() {
    // do stuff...
  }
}

let test = async function() {
  let promise = new MyPromise(function (resolve) {
    console.log('foo');

    resolve();
  });
  
  console.log('start printing:');
  
  await promise;
};

test();




我倾向Promise并希望创建一个派生自Promise类的课程。

我的问题:在我致电foo之前,有没有办法延迟打印await promise

更新

我想创建这个类,因为我想在对象是Promise时运行另一个方法。 (就像:mypromise.SomePromiseExtensionMethod())。

更新2:我的真实项目:



    let Task = (function () {
        let __data = {};

        __data.Run = function (...args) {
            if (args.length) {
                let func = args[0];

                return new Task(func);
            }
        };
        
        class Task extends Promise {
            constructor(action) {
                super(action);
            }
            static set Run(value) {
                return __data.Run;
            }
            static get Run() {
                return (...args) => __data.Run.call(this, ...args);
            }
        }
        return Task;
    }());
    
    let test = async () => {
      let task = Task.Run(r => r(console.log('foo')));
      
      console.log('start printing');
      
      await task;
    };
    
    test();




2 个答案:

答案 0 :(得分:2)

  

在我致电foo之前,有没有办法延迟打印await promise

是的,这被称为"懒惰"承诺。请注意,await只是用于调用then方法的糖,所以我们可以通过覆盖then方法来执行此操作,然后才运行执行程序回调:

class MyPromise extends Promise {
  constructor(func) {
    let run;
    super((resolve, reject) => {
      run = () => func(resolve, reject);
    });
    this.run = run;
  }
  then(onfulfilled, onrejected) {
    const run = this.run;
    if (run) {
      this.run = null;
      run();
    }
    return super.then(onfulfilled, onrejected);
  }
}

(async function test() {
  let promise = new MyPromise(function (resolve) {
    console.log('foo');
    resolve();
  });

  console.log('start printing:');

  await promise;
}());

请仅将此用于学习练习,我不建议在实际项目中使用此模式。

答案 1 :(得分:0)

您可以使用then

执行此操作

class MyPromise extends Promise {
  constructor(func) {
    super(func);
  }
}

let test = async () => {
  let promise = new MyPromise(function (resolve) {
    resolve();
  }).then(_ => console.log('foo'));
  
  console.log('start printing:');
  
  await promise;
};

test();

注意:扩展Promise对象是一个坏主意。