• Node中的promise简说及入门


    Node的特色之一就是异步回调,可是回调过多,就会形成著名的回调金字塔。

    直接上例子,我要读取1.txt里的内容,然后在这个内容上加上'test'并重新写入文件,如下代码所示:

    var fs = require('fs');
    fs.readFile('./1.txt', 'utf-8', function (err, msg) {
        if (err) {
            console.log(err);
        } else {
            fs.writeFile('./1.txt', msg + 'test', 'utf-8', function (err) {
                if (err) {
                    console.log(err);
                } else {
                    fs.readFile('./1.txt', 'utf-8', function (err, msg) {
                        if (err) {
                            console.log(err);
                        } else {
                            console.log(msg);
                        }
                    })
                }
            })
        }
    })

    那么如何解决这种金子塔型的代码呢?方法很多,在这里我们只介绍一种,那就是使用Promise,在node中我们可以通过Q来实现Promise~  

    我们来了解下promise基础知识。

    1.promise可以将金字塔代码风格变为链式。

    2.then是promise的核心方法,我们可以用这个方法从异步中获得返回值或者跑出异常,then方法有两个可选的参数,都是callback函数,分别是onFulfilled 和 onRejected,promise被解决时(异步处理已经完成)会调用onFulfilled 和 onRejected 。因为只会有一种结果,所以这两个函数中仅有一个会被触发。

    3.then返回的是promise

    下来我们把上面的代码用Q来实现,代码如下:

    var Q = require('q');
    //1.写一个读取文件的方法,将它封装成promise
    function fs_readFile(file, encoding) {
        var deferred = Q.defer();
        fs.readFile(file, encoding, function (err, data) {
            if (err) deferred.reject(err);
            else deferred.resolve(data);
        })
        return deferred.promise;
    }
    //2.写一个写入文件方法,将它封装成promise
    function fs_writeFile(data, file, encoding) {
        var deferred = Q.defer();
        fs.writeFile(file, data, encoding, function (err) {
            if (err) deferred.reject(err);
            else deferred.resolve('ok');
        })
        return deferred.promise;
    }
    //3.实现逻辑
    fs_readFile('./1.txt', 'utf-8')
        .then(function (data) {return fs_writeFile(data + 'test', './1.txt', 'utf-8')})
        .then(function(){return fs_readFile('./1.txt', 'utf-8')})
        .then(console.log,console.error);

    上面的例子我们是用Q.defer可以手动创建promise。当然还可以使用另外的方式来创建promise,如Q.denodeify。

    Q && promise很强大,需要大家用心用时间自己去体会,先简单介绍到这吧。

  • 相关阅读:
    php反射类 ReflectionClass
    大写中文数字-財务
    Cookie/Session机制具体解释
    具体解释VB中连接access数据库的几种方法
    Hibernate Criterion
    hdu1151 Air Raid,DAG图的最小路径覆盖
    【收藏】十大Webserver漏洞扫描工具
    美国地名大全(美国城市名称英文、中文)
    图像切割之(五)活动轮廓模型之Snake模型简单介绍
    数据库索引的作用和长处缺点
  • 原文地址:https://www.cnblogs.com/showtime813/p/4494289.html
Copyright © 2020-2023  润新知