Promise 对象中的 setTimeout
setTimeout inside Promise object
我正在开始 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)
不是 return 函数。
您可以这样做以将其包装到一个函数中:
setTimeout(() => add(numberArray, fullfil, reject),5000);
或使add
return成为一个函数:
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!');
}
}
function foo(varOne, varTwo) {
console.log(varOne, varTwo);
}
setTimeout(foo, 5000, 1, 2); // you pass the parameters after the time parameter
setTimeout(()=> {foo(1, 2)}, 5000); // you call the function inside an anonymous function
您可以查看这里了解更多详情:
如何将参数传递给 setTimeout() 回调?
我正在开始 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)
不是 return 函数。
您可以这样做以将其包装到一个函数中:
setTimeout(() => add(numberArray, fullfil, reject),5000);
或使add
return成为一个函数:
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!');
}
}
function foo(varOne, varTwo) {
console.log(varOne, varTwo);
}
setTimeout(foo, 5000, 1, 2); // you pass the parameters after the time parameter
setTimeout(()=> {foo(1, 2)}, 5000); // you call the function inside an anonymous function
您可以查看这里了解更多详情: 如何将参数传递给 setTimeout() 回调?