zoukankan      html  css  js  c++  java
  • ES6 promise初体验

    promise是ES6新增的语法,可用于解决回调地狱的问题

    var fs = require('fs')
    
    var p1 = new Promise(function (resolve, reject) {
        fs.readFile('./data/a.txt', 'utf8', function (err, data) {
            if (err) {
                reject(err)  //失败,调用.then的第二个回调函数参数
            } else {
                resolve(data)//成功,调用.then的第一个回调函数参数
            }
        })
    })
    
    var p2 = new Promise(function (resolve, reject) {
        fs.readFile('./data/b.txt', 'utf8', function (err, data) {
            if (err) {
                reject(err)
            } else {
                resolve(data)
            }
        })
    })
    
    var p3 = new Promise(function (resolve, reject) {
        fs.readFile('./data/c.txt', 'utf8', function (err, data) {
            if (err) {
                reject(err)
            } else {
                resolve(data)
            }
        })
    })
    
    p1
        .then(function (data) {
            console.log(data)
            // 当 p1 读取成功的时候
            // 当前函数中 return 的结果就可以在后面的 then 中 function 接收到
            // 当你 return 123 后面就接收到 123
            //      return 'hello' 后面就接收到 'hello'
            //      没有 return 后面收到的就是 undefined
            // 上面那些 return 的数据没什么用
            // 真正有用的是:我们可以 return 一个 Promise 对象
            // 当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve
            //
            return p2
        }, function (err) {
            console.log('读取文件失败了', err)
        })
        .then(function (data) {
            console.log(data)
            return p3
        })
        .then(function (data) {
            console.log(data)
            console.log('end')
        })

    上面的例子使用起来很臃肿,封装一下

    var fs = require('fs')
    
    function pReadFile(filePath) {
        return new Promise(function (resolve, reject) {
            fs.readFile(filePath, 'utf8', function (err, data) {
                if (err) {
                    reject(err)
                } else {
                    resolve(data)
                }
            })
        })
    }
    
    pReadFile('./data/a.txt')
        .then(function (data) {
            console.log(data)
            return pReadFile('./data/b.txt')
        })
        .then(function (data) {
            console.log(data)
            return pReadFile('./data/c.txt')
        })
        .then(function (data) {
            console.log(data)
        })
  • 相关阅读:
    Ubuntu16.04 中 Vscode 如何断点调试C语言程序
    PHP疑难杂症
    PHP之外观模式
    23种设计模式之适配器模式(Adapter Pattern)
    23种设计模式之原型模式(Prototype Pattern)
    23种设计模式之单例(Singleton Pattern)
    23种设计模式之抽象工厂(Abstract Factory Pattern)
    23种设计模式之工厂方法(Factory Method Pattern)
    简单工厂
    Nosql之Redis
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10515928.html
Copyright © 2011-2022 走看看