[英]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.