初识nodeJs,填坑(一)去异步(同步化)
序言
本人是java程序员,应公司业务需要开发,用nodejs+electron+vue开发一个桌面应用,主要功能是从服务器上http远程访问下载到本地,做离线case开发。类似于手机里面的应用市场。管理离线应用正在下载、下载中。废话不多说,讲讲我一个菜鸟在nodejs 遇到的问题以及解决思路。
nodejs 去异步
nodejs对于我从零开始,好 网上百度浏览网站自学,查api,看例子。其实nodejs没有什么很神奇,语法就是js。加上引用一些模块,类似java引用jar包。但是一开始我就掉进了nodejs最大特性的坑中—nodejs是异步执行的。每次一个方法没有执行完就会执行下一个语句。这处理起来很麻烦。总结:node的去异步方式主要有三种:方法嵌套,递归调用,调用类库。 其实不然,还有两种:子线程child_process、Es6 Promise。
- 方法嵌套、递归调用 大家可以参照链接https://blog.youkuaiyun.com/whjcsdnwhj/article/details/78705070,本人未用,感觉繁琐;
- 调用类库 常用的Step Async,用Async就好。
async function xx(){ // 同步块方法前添加 await await function xxx(); }
- 使用nodejs的child_process模块可以实现多进程任务。利用child_process可以创建子进程,实现子进程和主进程之间的通信。
异步创建: child_process.spawn(command[, args][, options]) options.stdio options.detached options.customFds child_process.exec(command[, options], callback) child_process.execFile(file[, args][, options][callback]) child_process.fork(modulePath[, args][, options]) 同步创建: child_process.spawnSync(command[, args][, options]) child_process.execFileSync(command[, args][, options]) child_process.execSync(command[, options])
- 利用 new Promise 实例化然后then处理控制同步,同时解决了异常处理;
// 1 有A B 方法,B必须在A执行完才开始执行,示例如下 function Main(){ //......... var p = A(); p.then(function(values){ //这是成功返回 B(); },function(resason){ //这是失败返回 B(); }); } function A(){ return new Promise(function(resovle,reject){ resolve(values);//成功返回 reject(resason);//失败返回 }); } function B(){ //........... } // 2 有A1 A2 A3 B 方法,B必须在A1 A2 A3执行完才开始执行,示例如下 function Main(){ //......... let arrs = []; arrs.push(A1()); arrs.push(A2()); arrs.push(A3()); var p = Promise.all(arrs); p.then(function(values){ //这是所有resovle成功返回 B(); },function(resason){ //只要有一个reject失败返回 B(); }); }
文件下载,断点续传
下篇介绍