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