node.js使用async完成同步调用
2017-11-06 20:13
429 查看
node.js让初学者最头疼之处,莫过于彻头彻尾的异步机制。所有代码,在排版上的先后顺序并不决定了其调用顺序。然而人的思维恰恰是按照同步顺序流转的,于是令人叫苦不迭的情况应运而生——你理所当然的编写了一段看似顺序执行的代码,激动一run,哎哟我滴妈——null、颠倒的值、莫名的值不约而同的结伴而至。历经数次磨难,我对node的异步机制有了一定认识,能规避新手坑了。当然,想全面避坑光理解异步还不够,因为有时你必须使用同步执行,两个方法必须有先后顺序才能达到特定功效。async包为我们提供了node下的同步执行方法。
首先,在需要使用同步调用的文件引入async(之前要先npm install async,在此不赘述):
var async = require('async');
之后,将要顺序执行的方法放入async的series方法中:
async.series([function(cb){//your code here},function(cb){//your code here}],function(){//your code to be run at last});
格式为async.series(arrays,done);,arrays是要执行的代码数组,每段代码要被function(cb){}包裹,done是最后无论如何都会执行的代码,相当于java中finally的作用。
最后有一个重点说明:cb相当于一个执行标志,每一个代码段都由cb控制,cb在哪就代表在这之前的代码都必须被顺序执行到才能进入下一个代码段,这对于控制带有回调函数的代码的顺序执行至关重要。下面举个我自己项目的例子:
首先,在需要使用同步调用的文件引入async(之前要先npm install async,在此不赘述):
var async = require('async');
之后,将要顺序执行的方法放入async的series方法中:
async.series([function(cb){//your code here},function(cb){//your code here}],function(){//your code to be run at last});
格式为async.series(arrays,done);,arrays是要执行的代码数组,每段代码要被function(cb){}包裹,done是最后无论如何都会执行的代码,相当于java中finally的作用。
最后有一个重点说明:cb相当于一个执行标志,每一个代码段都由cb控制,cb在哪就代表在这之前的代码都必须被顺序执行到才能进入下一个代码段,这对于控制带有回调函数的代码的顺序执行至关重要。下面举个我自己项目的例子:
/* 添加一个用户 */ exports.addAUser = function (values, callback) { let user = null; async.series([function (cb) { //顺序执行的代码一 sqliteHelper.findNoteById(tableName, keyName, values[0], function (error, result) { if (error) throw error; user = result; }, function (error) { if (error) throw cb(error, null); //回调函数中也要传入cb,否则如果cb放在回调函数之外则无法完成同步 cb(null); }); }, function (cb) { //顺序执行的代码二 //0代表error,1代表成功添加用户,2代表用户已存在无法添加 if (user === null) { sqliteHelper.add("users", colNames, values, function (error) { if (error) { util.log('Fail on add a user:' + values[0] + 'because of error:' + error); callback(error, 0); } else { callback(null, 1); // console.log("exist"); } //回调函数中也要传入cb,否则如果cb放在回调函数之外则无法完成同步 cb(error); }); } else { 4000 callback(null, 2); cb(); } }], function (error, values) { if (error) throw error; }); }
相关文章推荐
- 使用node.js中的async模块进行数据库的同步操作
- node.js学习笔记(4)--使用Express完成简单的登陆
- 使用Node.js完成的第一个项目的实践总结
- Node.js 使用async模块
- 使用async/await——Nodejs+ExpressJs+Babel
- 使用nodejs+socket.io+redis订阅发布完成竞拍的过程
- node.js对mongodb的连接&增删改查(附async同步流程控制)
- 使用Node.js完成的第一个项目的实践总结
- node.js之async的使用(series,whilst)
- node.js使用express框架完成文件下载
- Windows下Node.js使用child_process模块调用系统命令的编码问题
- 【nodejs】使用Node.js实现REST Client调用REST API
- 在 Node.js 中使用 async 函数的方法
- node.js——async同步异步
- 使用Node.js+socket.io制作服务端,unity+socket.io for unity 制作客户端 ,验证位置同步Demo
- Node.js 中使用 async 函数的方法
- node.js中同步和异步共同使用时应额外注意
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- Node.js中async的简单使用
- node.js 关于 async的使用