node c语言回调函数注册怎么看

十个Node.js开发易犯错误之三:多次执行一个回调函数
十个Node.js开发易犯错误之三:多次执行一个回调函数
 有多少次你保存好源码后,然后重新启动Node应用后,你看到了快速的崩溃?大部分情况是由于两次执行回调函数,意思是,在第一次使用以后忘记返回它了。
 让我们创建一个案例来重现这个情况,我们曾经一个简单的代理服务器,带有基本验证功能,这需要安装request依赖,运行它然后打开:。源码如下:
var request = require('request');
var http = require('http');
var url = require('url');
var PORT = process.env.PORT || 1337;
var expression =
/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/
var isUrl = new RegExp(expression);
var respond = function(err, params) {
var res = params.
var body = params.
var proxyUrl = params.proxyU
console.log('%s - %s', new Date(),
proxyUrl);
res.setHeader('Content-type',
'text/ charset=utf-8');
if (err) {
console.error(err);
res.end('An error occured.
Please make sure the domain exists.');
res.end(body);
http.createServer(function(req, res) {
var queryParams =
url.parse(req.url, true).
var proxyUrl = queryParams.
if (!proxyUrl ||
(!isUrl.test(proxyUrl))) {
res.writeHead(200, {
'Content-Type': 'text/html' });
res.write(&Please provide a
correct URL param. For ex: &);
res.end(&&a
href='http://localhost:1337/?url=http://www.google.com/'&http://localhost:1337/?url=http://www.google.com/&/a&&);
console.log('trying to proxy to
%s', proxyUrl);
//注意下面这段代码的问题
request(proxyUrl, function(err,
r, body) {
if (err) {
// auch, forgot to return
respond(err, {
proxyUrl: proxyUrl
console.log(0);
respond(null, {
body: body,
proxyUrl: proxyUrl
}).listen(PORT);
console.log('application started on port %s', PORT);
 在上面代码中我们标注了需要注意的代码部分,在这回调函数中,我们处理了错误情况(if err语句里),但是在调用respond 函数以后忘记停止了执行流程,这样就没有任何网站响应,respond函数被调用两次,我们在控制台得到下面的信息:
Error: Can't set headers after they are sent
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at respond (/Users/alexandruvladutu/www/airpair-2/3-multi-callback/proxy-server.js:18:7)
This can be avoided either by using the `return` statement or by wrapping the 'success' callback in the `else` statement:
解决方式:
request(.., function(..params) {
 if (err) {
   return respond(err, ..);
  respond(..);
request(.., function(..params) {
 if (err) {
   respond(err, ..);
  } else {
   respond(..);
本节源码下载:
企业级软件架构解决之道
如有意见请与我们联系 Powered by JdonFramework【跟谁学社区】-学习论坛_学习小组_兴趣小组
话题小组123帮你解决孩子教育和妈妈成长问题NEW「职说Talk」,专属职场人学习的平台。NEW领先的高考状元培养社群。NEW外教爸爸双语宝宝让0-12岁儿童爱上英语三岁看小,七岁看老,家庭教育至关重要!这里有你想要的咨询,快来加入吧!嗨!We are 伐木累!一起打造嗨皮高中生活~~来找到与你相知的那一群人!情调的生活,钱多多的职场,都是我们的!张开梦想的翅膀,我们飞向新世界!粉丝互动、建议反馈,嗨起来~中国爱乐乐团第一小提琴手高中小海量资料,坚持看一年,英语会改变30年成就3000万人魅力表达、身心富足瑜伽,让你遇到最美丽的自己!解析高考招生政策,介绍大学和专业最简单方法。分数+ 能力,语言+ 逻辑。三分长相 七分打扮 会打扮的女人最好命!既然选择远方,便只顾风雨兼程关于日语、关于日本,一起聊聊吧每天都离法国更近一点在喧嚣的世界中打造一片心灵的净土!爱美术,爱生活每日变换自己的装束,分享你的美!蹦沙卡拉卡~帅哥美女看这里~大千世界,总有你不知道的事~热门帖子1739163223142612021112210341340001011110411000021010111...hi,欢迎来到跟谁学社区登录
关注我们官方微信关于跟谁学服务支持帮助中心nodejs回调函数相关的博客
前言 React 作为一项热门的前端开发技术,现在使用它的团队越来越多。之前也介绍了react 的所有的特性,但是仅仅了解怎么开发 react 只走了万里长征的第一步,将 react 投入到真实应用还会遇到各种各样的问题。 例如SEO需要静态化怎么办?单页面应
在并发编程中, 经常需要对共享数据(对象)添加同步锁, 但同步锁会导致程序性能下降。下面总结了一些避免同步锁的方法: 无状态 因为对象内部不维护状态,自然就没有并发修改问题。如果一个服务器程序不保存用户的状态,那么就可以很容易进行横向扩容。 使用不变对象 当
Node.js工具模块 node工具模块分为OS,Path, Net, DNS, Domain模块 OS 字节顺序 字节顺序,称为端序和尾序,是跨越多字节程序对象的储存规则 如果最低有效位在最高位的前面,则为小端序,反过来为大端序 端的起源 来自于格列佛游记
Node.js工具模块 node工具模块分为OS,Path, Net, DNS, Domain模块 OS 字节顺序 字节顺序,称为端序和尾序,是跨越多字节程序对象的储存规则 如果最低有效位在最高位的前面,则为小端序,反过来为大端序 端的起源 来自于格列佛游记
nodejs回调函数相关问答
阿里极客公益活动:
或许你挑灯夜战只为一道难题
或许你百思不解只求一个答案
或许你绞尽脑汁只因一种未知
那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了
他们用户自己手中的技术来帮助用户成长
本次活动特邀百位阿里技术
目前想到的方式这样来获取数据,但感觉不是很好,这三次sql查询应该可以同时进行进行的,不用在某个sql回调函数中执行,但是最后要把这些查询到的数据传给res.render的话,我怎么判断他们各自已经成功从mysql中查询和返回了呢?如图:
有没有mongodb for nodejs 的插件在查询的时候可以返回查询结果?
目前找了几个nodejs的插件,mongoose,mongous等等,都是在查询方法里面使用回调函数来返回查询结果,但是我的node脚本需要把查询结果return出来,而不只是
HTML5 是下一代的 HTML。HTML5的设计目的是为了在移动设备上支持多媒体。H5游戏,你可以看作是移动端的web游戏,H5游戏无需下载软件即可体验,这就是H5在传播上的优势。H5视频制作也是H5的重要应用领域之一。
![zuchtjap_jpeg](
nodejs回调函数相关问题集
NodeJS的回调函数中的变量怎么在回调函数外使用
例如fs的readFile方法:
fs.readFile(filename, [op
当然node.js非常强调异步,这意味着我需要在input里回调checkGuess,在checkGuess里回调displayAns,而在displayAns里再回调input——这似乎给刚学编程的小孩过于复杂了。而采用像CPS这样的
... newsList 数组的其中一个元素
// 函数的第二个参数是回调函数
async.eachSeries(newsList, function(news, next) {
// 读取新闻正文
...务器,无须做复杂的配置。
4.nodejs基于事件驱动,异步回调机制,适合大并发量的请求。
5.nodejs社区非常活跃,有很多成熟的套件可以使用,而且还在持续更新。
当然,优点还有很多,这里简单列举几条。下面说说个人认为...
nodejs回调函数相关基础文章
...的朋友可以参考下
node.js中与生俱来的单线程编程、回调函数异步式风格让我们有时喜有时忧。先说单线程,很多人会费解于node.js的单线程如何能做到高并发?这个问题不是本文重点,点到为止。澄清一点,node.js的单线程...
  将事件逻辑从应用逻辑中解耦
  消除回调函数的恐怖三角
  控制并行的异步操作
  JavaScript promise是一个承诺将在未来返回值的对象。是具有良好定义的行为的数据对象。promise有三种可能的状态:
...用Promise来封装异步函数,使用统一的链式API来摆脱多重回调的噩梦,非常的实用的小技能,希望小伙伴们能够喜欢
  在写Node.js的过程中,连续的IO操作可能会导致“金字塔噩梦”,回调函数的多重嵌套让代码变的难以维护,...
...面的的 wrap方法总给人以一种 future其实在吞噬异步方法的回调函数,并直接返回异步结果。事实上 future也通过
resolve方法提供设置回调函数的解决方案。 resolve最多接受两个参数,如果只传入一个参数,
future认为传了一个
nodejs回调函数相关资料
...是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数:
复制代码 代码如下:
fs.readFile('/etc/passwd', function (err, data) {
...接导致多个异步同时进行时,无法确定最后的执行结果来回调。举个简单的例子:
for(var i = 0; i & 5; i++) {
fs.readFile('file', 'utf-8', function(error, data){});
...相关的函数挺多的。首先可以分为两大类。
一类是异步+回调的。 一类是同步的。
在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可
1. 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C语言...
...码如下:
var obj = setTimeout(cb, ms);
setTimeout 用于设置一个回调函数 cb,其在最少 ms 毫秒后被执行(并非在 ms 毫秒后马上执行)。setTimeout 返回值可以作为 clearTimeout 的
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低...
阿里云函数计算(Function Compute)是一个事件驱动的全托管计算服务。通过函数计算,您无...
云数据库PPAS版,是阿里云与EnterpriseDB公司合作基于PostgreSQL高度兼容Ora...
PostgreSQL被业界誉为“最先进的开源数据库”,面向企业复杂SQL处理的OLTP在线事务处理场...有谁能简单地解释一下node.js的异步和回调函数 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
PPA for Ubuntu
> ppa:chris-lea/node.js
有谁能简单地解释一下node.js的异步和回调函数
02:41:56 +08:00 · 5486 次点击
水平渣,看得我有点混了大概就是http.get(url,function(res){ 在这里获得某个数据a}在外部调用数据aconsole.log(a) //
17 回复 &| &直到
08:00:00 +08:00
& & 03:32:37 +08:00
和js的异步和回调不一样?
& & 06:23:09 +08:00
你就当它在某个时候(满足某个条件)就一定会调用就行,嘿嘿
& & 09:15:41 +08:00
“我不会等你,我先做我的,你继续做你的,等会我会向你要成果。”这篇日记是不是有帮助呢?看里面解释的回调函数。另外,看第一个例子就好了:
& & 10:40:12 +08:00
当有异步通讯触发的时候就调用这个回调函数了,就像在C#里面是写一个委托去调用某个函数的,思路应该都差不多的
& & 12:55:53 +08:00
在外部调用 console.log(a) 的话,这样:setInterval( function() { console.log(a) }, 100 )看日志你差不多就明白了
& & 22:44:31 +08:00
& & 08:55:11 +08:00
http.get(url,function(res){在这里获得某个数据aconsole.log(a)}
& & 09:52:39 +08:00
回调函数而已。function http_get_callback(res){ /// do something}http.get(url, http_get_callback);这样写能看懂么那么改成匿名函数再调一下位置呢http.get(url, function(res){ /// do something});
& & 16:32:29 +08:00
就是字面上的意思。比如正常的流程是A→B→C其中A→B需要5分钟才能执行完的话,那么执行C就是5分钟后的事情了。而异步就是A→C → B 在B出结果前,直接先执行C,不用等5分钟,但是这样子的话C的执行环境就跟B是没有关系了。发现越简单的道理越难解释~
& & 22:20:46 +08:00
其实主要是event loop,看下这篇文章:
& & 22:47:39 +08:00
简单回一个吧,回调函数就是你做完某事调我就行,这里面不一定涉及到异步。比如:function a (callback) { var now = new D while (new Date - now &= 5000) {} callback && callback();}a(function () { console.log('callback'); });和a();console.log('callback');并没有扯到所谓的异步。function b (doSomething, doAnother) { // 不好意思我要占用太久时间,doAnother你要等不及就先不管我吧 setTimeout(function () { var now = new D while (new Date - now &= 5000) {} doSomething && doSomething(); }, 0); doAnother && doAnother();}b(function () { console.log('do something...');}, function () { console.log('do another...');});这里的doSomething和doAnother都是回调,但是它们在内部就是异步执行的了。。异步编程主要就是解决等待问题...
& & 22:52:20 +08:00
好吧代码格式乱完了,重新贴个截图吧。
& & 23:11:20 +08:00
回调一般应该是在将来某个时候会执行,node里一般是触发IO事件的时候,这么做可以更有效利用系统调度,提高并发量。
& & 00:37:27 +08:00
@ 多谢各位
& & 18:47:31 +08:00
@ 这个字体是?感觉括号看起来蛮爽的~
& & 23:34:45 +08:00
@ Monaco ~
& & 12:40:45 +08:00
可以参考下这张图
& · & 2070 人在线 & 最高记录 3762 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 17ms · UTC 15:09 · PVG 23:09 · LAX 08:09 · JFK 11:09? Do have faith in what you're doing.说明:本人是node.js的初学者,尝试向别人解释这是怎么回事是自我学习的一个好方法。如果你发现有些地方并不是那么正确,欢迎提出来让我知道以便修正,共同进步,谢过^_^。 & & & 欢迎交流,本人微博:http://weibo.com/bitsea&
很多地方都涉及到函数的回调,在这里简单说一下什么是函数的回调。
回调函数就是回来再调用的函数。
基于js的单线程执行代码的风格,回调是必须的选择。也可以说是一种不得已而为之的选择吧,回调无疑增加了代码的复杂性,使其变得难读、难理解,难维护。但是,在解决实际问题的时候,回调又非常有效。下面举例说明:
我们要读取一个很大的文件,但是我们有不需要立刻获得读取的结果,并且,我们可不只有读取文件这个任务,我们还要执行其他的代码。这个时候,我们就需要回调函数过来帮忙。
1 var fs=require(&fs&);
2 fs.readFile(&text.txt&,utf-8,function(err,result){
If(err) throw
//result就是读取出来的数据
6 console.log(&下一项任务&);
这样一来,就可以把读文件那个任务放一放了,我们完成完我们的下一个任务的时候,闲得慌的时候再回来执行它不晚,有错误就抛出来。
这个方法在很多的node.js工程上面有大量的应用(就我接触的而言),复制一段项目里面的几句代码(有关查询数据库):
1 conn.query("select login,qq,phone,type from user where name='"+myphone+"'",function(err, rowss, fields) {
if (err) {console.log(err);res.end();return;}
if(rowss.length&1) {res.end("{{}}alert{}操作失败,你的手机没有登记过{{}}");return;}
这里的function就是回调函数。
我又在另一篇国外的人写的文章,他从客户端的角度阐述了为什么采取回调函数的解决方案是node的必然选择:我们知道,php为每一个客户端开辟一个新的线程用于服务新的请求,但是由于node的&先天残疾&,如果前一个请求需要花费5s,后一个请求就不得不等待5s!这是不能忍的,我在抢票回家过年好咩!!这个叫阻塞,前一个阻塞掉后一个。我们要把它变成一个非阻塞的,每个人都有公平的机会抢到回家的票。于是就用到回调函数。
文章中还打了一个很有意思的比喻,这里摘抄过来:
你在一个狭窄的道路上开车,前面有一个SB在停着打电话,很忙的样子(阻塞代码)使你不能到达目的地,这样你必须等这个SB打完电话把车启动起来才 能继续(有人可能想,用板砖干他丫的,但从程序角度来说,把他丫干死,前面少了一个司机,你要等警察来拖走或者自己先开走他的后再开自己的车,外加法律责 任,代价是很大滴,这叫破坏模型,比阻塞模型的代价还大)。
想像一下如果这条路上有紧急停车带,前面那SB司机可以变得不SB,先把车停在紧急停车带打电话。把路让出来让你先继续你的旅程。当那个不再SB的 司机打完电话之后也可以回到主干上来继续前行,还避免了可能碰到的板砖型程序员而导致血光之灾,皆大欢喜。这跟异步调用很像,在同一时间同一主干上跑多辆车。
非常有趣,isn&t it?
咳咳,好了言归正传。上代码(三段)说明问题!!
var http = require('http');
var url = require('url');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
if( url.parse(request.url).pathname == '/wait' ){
var startTime = new Date().getTime();
while (new Date().getTime() & startTime + 15000);
response.write('Thanks for waiting!');
response.write('Hello!');
response.end();
}).listen(8080);
console.log('Server started');
代码读起来不难,创建了可一个服务器,监听8080端口。我们运行node这个文件之后,在浏览器里面输入localhost:8080/wait回车,代码开始起作用,十五秒之后蹦出来一句话。
这不能说明什么问题。但是,在你按下回车之后的15秒内,另一个客户需要访问这个这个服务器的时候,也需要等待你完成之后才轮到他。黄花菜都凉了!
下一段代码(包含两个文件):
block.js:
var startTime = new Date().getTime();
while (new Date().getTime() & startTime + 10000);
var http = require('http');
var url = require('url');
var cp = require('child_process');
function onRequest(request, response) {
var pathname = url.parse(request.url).
if( pathname == '/wait' ){
cp.exec('node block.js', myCallback);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('Hello!\n');
response.end();
console.log('New connection');
function myCallback(){
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('Thanks for waiting!\n');
response.end();
http.createServer(onRequest).listen(8080);
console.log('Server started');
两段代码类似,这个多申请了一个cp子进程,用于在用户访问wait域名的时候调用block.js。在其他用户访问非wait域名的时候,服务器仍然能及时响应hello,这个时候道路还是通畅的,原因就是上一个sb还在紧急停车带打电话呢!这一切都归功于cp.exec('node block.js', myCallback);里面的回调函数:myCallback。.exec函数有两个参数,一个调用block.js,另外一个执行回调函数。
第三段代码(一个读取文件的程序):
var http = require('http');
var fileSystem = require('fs');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
var read_stream = fileSystem.createReadStream('myfile.txt');
read_stream.on('data', writeCallback);
read_stream.on('close', closeCallback);
function writeCallback(data){
response.write(data);
function closeCallback(){
response.end();
}).listen(8080);
console.log('Server started');
这里使用了内置的文件操作模块,使用函数.createReadStream()读取文件。
无论你是否有需要执行一个耗时很长的程序与否,你都应该使用非阻塞模型,并且记住,正确使用回调和异步可以让代码的速度和稳定性都能得到提高。
阅读(...) 评论()}

我要回帖

更多关于 js中什么是回调函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信