Nodejs回调地狱之co+Promise彻底解决办法

使用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...这句是在串行代码后面的语句.");

Nodejs回调地狱之co+Promise彻底解决办法

执行效果

是不是相比之下, 神清气爽!

下面看具体过程:

先安装模块

npm install co

Nodejs回调地狱之co+Promise彻底解决办法

安装成功应该看到上图的样子

然后引用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();

Nodejs回调地狱之co+Promise彻底解决办法

执行效果

可以按照自己的实际场景选择使用

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.net/procedure/25500.html

发表评论

登录后才能评论