简体   繁体   English

计算器用js promise

[英]Js promise for calculator

I have a simple calculator function that I wrote for a coding challenge.我有一个简单的计算器 function,是我为编码挑战而编写的。 Now I'm having trouble with an additional calculate function that should return a promise.现在我遇到了额外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);
        });
    }
}

And here are the tests that the promise needs to meet:以下是 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();
    } );
  } );
} );

The above calculate function I wrote only passes the first test and none of the other.以上calculate function 我写的只通过了第一个测试,其他都没有。 I fear I'm going about it all wrong.我担心我做错了。 How can I make it work?我怎样才能让它发挥作用?

Some remarks on your attempt:关于您尝试的一些评论:

  • The requirements do not suggest that you need to delay a result using setTimeout .这些要求并不建议您需要使用setTimeout延迟结果。

  • There is no need for ...args as parameter list for calculate .不需要...args作为calculate的参数列表。 It will only get one argument, and it should be a function.它只会得到一个参数,它应该是一个 function。

  • The result variable is never set to anything else than 0. It would need to be the result by calling the callback function (the argument passed to calculate ). result变量永远不会设置为 0 以外的任何值。它需要是调用回调 function(传递给calculate参数)的结果。

  • resolve should be called with the result as argument. resolve应该以结果作为参数调用。

  • reject should be called with NaN as argument reject应该以NaN作为参数调用

  • There is no specification that when the result is NaN , the promise should be rejected.没有规定当结果为NaN时,应拒绝 promise。 The opposite is true: when the promise rejects (because of an error) it should reject with NaN as reason.反之亦然:当 promise 拒绝(因为错误)时,它应该以 NaN 为理由拒绝。 The last test in the test sequence, passes no argument to calculate , which would lead to an error while calculate tries to execute an argument that is undefined.测试序列中的最后一个测试没有将参数传递给calculate ,这会在calculate尝试执行未定义的参数时导致错误。 And then it should return a rejected promise.然后它应该返回一个被拒绝的 promise。

We can avoid calling the Promise constructor by declaring the method as async .我们可以通过将方法声明为async来避免调用 Promise 构造函数。 Here is an implementation that passes those tests:这是通过这些测试的实现:

    async calculate(f) {
        try {   
            return f.call(this);
        } catch {
            throw NaN;
        }
    }

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

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