3 回答
TA贡献1836条经验 获得超3个赞
在node.js开发过程中会遇到层层回调,虽然回调是node.js的优势所在,但同样也是坑。有如下场景需要返回多层回调函数中的结果:
http.request("/url", function(res){
obj.get(res, function(res2){
obj.get(res2,function(res3){
//此处可以得到res3
});
});
console.log('结束');
});
假如有一个函数
var func1 = function() {
//在这里会用到上面的那段代码
}
就像下面这样
router.get('url', function(req, res) {
http.request("/url", function(res1) {
obj.get(res, function(res2) {
obj.get(res2,function(res3) {
//得到res3后传值到页面
res.render('html',{res:res3})
});
});
});
});
如果我们有多个路由都需要用到那段代码的返回值,我们或许会把它提取出来当做一个公共的部分来使用,于是把它放到一个函数中:
var func2= function(){
http.request("/url", function(res){
obj.get(res, function(res2){
obj.get(res2,function(res3){
//在此处返回得到的值
returen res3;
});
});
console.log('结束');
});
}
然后在每个路由中调用,可是结果却出人意料,在调用func2()以后并没有得到想要的结果res3,事实上已经输出了“结束”两字。
其实这就是node.js的异步回调导致的结果,整个代码段走完了,回调函数中的值却没有返回。
那该怎么办?解决办法还是用回调解决,将上面代码改写:
var func2= function(param, callback) {
http.request("/url", function(res) {
obj.get(res, function(res2) {
obj.get(res2,function(res3) {
callback(res3);
});
});
console.log('结束');
});
}
接下来就是调用上面这段代码:
router.get("url", function(req, res) {
func2(p1, function(res2) {
res.render("html", {res:res2});
});
});
TA贡献1827条经验 获得超4个赞
1.阻塞调用(读取完文件再执行后面的操作)
var fs = require("fs");
var data = fs.readFileSync('/fs.txt');
console.log(data.toString());
console.log("程序执行结束!");
输出结果:
“文件内容”
“程序执行结束!”
2.非阻塞调用(读取文件和其他操作同步执行)
var fs = require("fs");
fs.readFile('/fs.txt',function(err,data){
if(err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
输出结果:
“程序执行结束!”
“文件内容”
如果我们每行代码的执行都不依赖于上一行代码的执行结果,那没问题,顺序执行就好。但是如果我们某行代码的执行,依赖于上一行代码的结果,这个时候就需要回调函数了。我们必须要使用回调函数返回上一行代码的结果,然后才能继续执行这一行代码。
TA贡献1802条经验 获得超6个赞
简单点说,用户是实现方,实现方需要调用A()函数,但为了A()函数具有通用性,需要根据实现方的意愿调用实现方提供的函数cbB(),在这里cbB()即为回调函数。
在Windows编程中回调函数用途很广泛。
完成的回调函数进行计数判断:
function check () {
nums–;
if (nums === 0) { // do something. }
}
- 3 回答
- 0 关注
- 3205 浏览
添加回答
举报