簡體   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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM