Code.js
var Util = function(){
function factorial(n, callback){
if(n == 1){
return n;
} else {
return n*factorial(n-1, callback);
}
/*callback(returnValue); */ // Where should this line go?
}
return{
factorial: factorial
};
};
exports.Util = Util;
Test.js
var vows = require('vows'),
assert = require('assert'),
Util = require('./Code').Util;
var u = new Util();
vows.describe('Testing Utils').addBatch({
'Test Factorial async':{
topic: function(){
u.factorial(5, this.callback);
},
'The output must be 120': function(result, ignore){
assert.equal(result, 120);
}
}
}).run();
在node.js上运行
> node Test.js
我没有触发错误回调。
我理解的是在我的函数返回之前,如果我能够放置这个脚本:
callback(computeValue);
这应该适用于恕我直言。如果我错了,请纠正我。
但是,我不明白我在哪里插入这个。
谢谢你的时间!
答案 0 :(得分:1)
首先,您的代码不是异步的,您需要使用process.nextTick或setImmediate,在当前情况下,测试用例应该如下所示:
code.js
var Util = function () {
this.factorial = function (n) {
if (n == 1) {
return n;
} else {
return n * this.factorial(n - 1);
}
}
};
exports.Util = Util;
test.js
var vows = require('vows'),
assert = require('assert'),
Util = require('./code').Util;
vows.describe('Testing Utils').addBatch({
'Test Factorial async': {
topic: new Util,
'The output must be 120': function (util) {
assert.equal(util.factorial(5), 120);
}
}
}).run();
答案 1 :(得分:0)
经过一些试验和错误,我现在能够应用递归:
我们的想法是将您的计算包装在一个函数中,以便在计算完成后可以触发callback(retVal)
function factorial(n, callback){
var retVal = (
function anonymous(num) { // note it is necessary to name this anonymous function to
// be able to call recursively
return (num == 1 ? num : num*anonymous(num -1));
}
)(n); // immediately execute with n;
// callback with retVal;
callback(retVal);
}