我开始使用JS和NodeJS。在编写hello-world应用程序时,遇到了setTimeout的不同行为。如果我能知道造成这种差异的原因,那就太好了。
方案1:响应等待5秒钟
方案2:尽管将超时设置为5秒,请求立即得到解决
两种情况下的代码差异是:在方案1中,setTimeout具有匿名函数,在方案2中,它调用同一模块中的另一个函数。
Calculator.js
方案1:
module.exports.addNumbers = function(numberArray){
return new Promise(function(fullfil, reject){
setTimeout(() => {
if(!(typeof numberArray === 'Array'))
reject('Not number elements found!');
},5000);
//fullfil(10000);
});
}
方案2:
module.exports.addNumbers = function(numberArray){
return new Promise(function(fullfil, reject){
setTimeout(add(numberArray, fullfil, reject),5000);
//fullfil(10000);
});
}
function add(numberArray, fullfil, reject){
if(!(typeof numberArray === 'Array'))
reject('Not number elements found!');
}
路由器(两种情况相同):
var express = require('express');
var router = express.Router();
var calculator = require('../services/calculator');
router.get('/',function(req,res,next){
//res.writeHeader(200,{'content-type':'text/plain'});
res.send('Hello World - ' + JSON.stringify(res));
console.log(res);
});
router.get('/testpromise',function(req,res,next){
calculator.addNumbers('First Try')
.then(function(result){
res.send(' Final Result ## '+result);
})
.catch(function(err){
res.send(' ERROR MSG ## '+err);
console.error(' ERROR MSG ##' +err);
});
});
module.exports = router;
第一个参数setTimeout
必须是要调用的函数。
在第一个示例中,您将提供这样的功能(() => {}
):
setTimeout(() => {
if(!(typeof numberArray === 'Array'))
reject('Not number elements found!');
},5000);
但是,在第二个示例中,您没有传递函数作为第一个参数,而是直接调用了该函数(因此将在该函数中对其进行求值)。
setTimeout(add(numberArray, fullfil, reject),5000);
至于我可以看到add(numberArray, fullfil, reject)
并没有返回功能。
您可以这样做将其包装为一个函数:
setTimeout(() => add(numberArray, fullfil, reject),5000);
或使add
返回函数:
function add(numberArray, fullfil, reject){
return () => {
if(!(typeof numberArray === 'Array'))
reject('Not number elements found!');
}
}
// or
function add(numberArray, fullfil, reject){
return function() {
if(!(typeof numberArray === 'Array'))
reject('Not number elements found!');
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句