node.js使用async完成同步调用
来源:互联网 发布:淘宝素材百度网盘 编辑:程序博客网 时间:2024/06/07 00:02
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在哪就代表在这之前的代码都必须被顺序执行到才能进入下一个代码段,这对于控制带有回调函数的代码的顺序执行至关重要。下面举个我自己项目的例子:
/*添加一个用户 */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 { callback(null, 2); cb(); } }], function (error, values) { if (error) throw error; });}
阅读全文
0 0
- node.js使用async完成同步调用
- Node.js 使用async模块
- node.js——async同步异步
- 使用 async Node.js 简化Javascript代码
- Node.js中async的简单使用
- node.js 关于 async的使用
- 在node.js 中使用async await
- NODE.JS async异步调用之串行化调用
- Node.js中async库同步接口介绍
- Node.js Async Tutorial
- node.js async
- node.js之async的使用(series,whilst)
- node.js async实践分享
- Node.js异步管理工具Async
- node.js async详细教程
- node.js 7 async / await
- node.js对mongodb的连接&增删改查(附async同步流程控制)
- Node.js Async Await in ES7
- 2017ccpc赛后总结(杭州站)
- Maven+MyBaits使用总结
- 算法设计周记(九)--二分查找
- 用宏来选择不同的代码段
- 存储过程
- node.js使用async完成同步调用
- python的练习小例子
- HTTP与SOCKET的区别
- SQSERVER版本区别
- OCamCalib与Improved OcamCalib的使用
- gluLookAt() 和 glOrtho() 的个人理解
- CS231N 笔记1_图片分类
- spring之Aop组件
- 搭建新项目注意事项