繁体   English   中英

计算器用js promise

[英]Js promise for calculator

我有一个简单的计算器 function,是我为编码挑战而编写的。 现在我遇到了额外calculate function 的问题,它应该返回 promise。

class Calculator{
    constructor(){
        this[Symbol.toStringTag] = 'Calculator'; 
    } 
    add(a, b) {
        return a + b; 
    } 
    subtract(a, b) {
        return a - b; 
    }  
    multiply(a, b) {
        return a * b;
    } 
    divide(a, b) {
        if(b === 0){ 
            return NaN;
        }
        return a / b; 
    }
    toString(){
        return "Calculator";
    }
    calculate(...args) {
        var result = 0;
        return new Promise(function(resolve, reject){
            setTimeout(function() {
                if(result === NaN) {
                   reject(NaN);
                } else {
                   resolve(result);
                }
            }, 1000);
        });
    }
}

以下是 promise 需要满足的测试:

describe( "Calculator.calculate", function(){
  let calculator;

  beforeEach( function(){
    calculator = new Calculator();
  } );
  
  it( "returns a promise", function( done ){
    const
      callDone = () => done(),
      calculating = calculator.calculate( () => void 0 );
    expect( calculating ).to.be.instanceOf( Promise );
    calculating.then( callDone ).catch( callDone );
  } );
     
  it( "resolves with the result when the calculation succeeds", function( done ){
    const calculating = calculator.calculate( function(){
      expect( this ).to.equal( calculator );
      let result = 0;
      result += this.add( 1, 2 );
      result += this.add( 3, 4 );
      return result;
    } );
    calculating
      .then( function( result ){
        expect( result ).to.equal( 10 );
        done();
      } )
      .catch( () => done() );
  } );
  
  it( "rejects with NaN when the calculation fails", function( done ){
    const calculating = calculator.calculate();
    calculating.catch( function( result ){
      expect( result ).to.be.NaN;
      done();
    } );
  } );
} );

以上calculate function 我写的只通过了第一个测试,其他都没有。 我担心我做错了。 我怎样才能让它发挥作用?

关于您尝试的一些评论:

  • 这些要求并不建议您需要使用setTimeout延迟结果。

  • 不需要...args作为calculate的参数列表。 它只会得到一个参数,它应该是一个 function。

  • result变量永远不会设置为 0 以外的任何值。它需要是调用回调 function(传递给calculate参数)的结果。

  • resolve应该以结果作为参数调用。

  • reject应该以NaN作为参数调用

  • 没有规定当结果为NaN时,应拒绝 promise。 反之亦然:当 promise 拒绝(因为错误)时,它应该以 NaN 为理由拒绝。 测试序列中的最后一个测试没有将参数传递给calculate ,这会在calculate尝试执行未定义的参数时导致错误。 然后它应该返回一个被拒绝的 promise。

我们可以通过将方法声明为async来避免调用 Promise 构造函数。 这是通过这些测试的实现:

    async calculate(f) {
        try {   
            return f.call(this);
        } catch {
            throw NaN;
        }
    }
①如果本文未解决您的问题,请点击查看与本文相关的问题
②如果本文未解决您的问题,请向程序员专用AI小助手提问
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM