使用Q模块后, 感觉回调问题还是没彻底解决,只是代码可以稍微优雅了一些, 估计是本人对Q模块了解不深, 不得其精髓, 于是有了这篇
主要目的,就是为了我们这些懒人带来解决问题更简单的办法
(想知道Q模块的小伙伴可以看上一篇<<如何用Q模块的链式调用来解决nodejs中的回调地狱问题>>)
先直接上最终代码, 看看清爽的顺序(串行)执行写法,绝对比回调写法好看一百倍
co(function* () {
let res1 = yield rfile('d:/aa.txt'); //第1条异步读取
let res2 = yield rfile('d:/bb.txt'); //第2条异步读取
let res3 = yield rfile('d:/cc.txt'); //第3条异步读取
console.log("co.res1:", res1.toString()); //输出结果
console.log("co.res2:", res2.toString());
console.log("co.res3:", res3.toString());
}).catch(onerror);
console.log("2...这句是在串行代码后面的语句.");
执行效果
是不是相比之下, 神清气爽!
下面看具体过程:
先安装模块
npm install co
安装成功应该看到上图的样子
然后引用co模块
const co = require('co');
封装读文件的方法(其它异步也是同理, 一通百通)
function rfile(fn) {
let promise = new Promise((resolve, reject) => {
fs.readFile(fn, (err, res) => {
if (err) {
reject(err); //抛出错误
} else {
resolve(res); //抛出结果
}
});
});
return promise; //返回Promise对象
}
这里最重要的其实是这块内容:
let promise = new Promise((resolve, reject) => {
//这里写回调代码
});
上可以直接运行的完整代码
const fs = require("fs");
const co = require('co');
co(function* () {
let res1 = yield rfile('d:/aa.txt');
let res2 = yield rfile('d:/bb.txt');
let res3 = yield rfile('d:/cc.txt');
console.log("co.res1:", res1.toString());
console.log("co.res2:", res2.toString());
console.log("co.res3:", res3.toString());
// process.exit(0);
}).catch(onerror);
console.log("2...这句是在串行代码后面的语句.");
//统一的错误处理方法
function onerror(err) {
console.error("co err:", err.stack);
}
function rfile(fn) {
let promise = new Promise((resolve, reject) => {
fs.readFile(fn, (err, res) => {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
return promise;
}
这里面, 最重要的是引用了Promise, 然后再利用co做了调用
划重点:其实, 如果不想用co的话, 也可以用async/await来代替:
//常规方法调用
async function abc() {
//一次执行样例
let res1 = await rfile('d:/aa.txt'); //第1条异步读取
let res2 = await rfile('d:/bb.txt'); //第2条异步读取
let res3 = await rfile('d:/cc.txt'); //第3条异步读取
console.error("async.res1:", res1.toString());
console.error("async.res2:", res2.toString());
console.error("async.res3:", res3.toString());
}
abc();
执行效果
可以按照自己的实际场景选择使用
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/procedure/25500.html