美文网首页
初识Promise

初识Promise

作者: 橘子柚子橙子_ | 来源:发表于2018-07-09 23:22 被阅读0次

    这是一篇很初级的有关Promise的知识整理,还有很多的知识点正在进行中...

    什么是Promise

    Promise中文的含义:许诺。为啥叫这个名字?可能是因为它的状态一旦发生,就无法再改变了,就像是做出了许诺。
    参照阮一峰老师《ES6标准入门》一书中的说法:Promise是一个容器,里面保存着某个未来才会结束的事件。从语法上来说,Promise是一个对象,从它可以获取异步操作的消息。

    Promise的特点

    1. 三种状态
      1.1 进行中-pending
      1.2 已成功-fulfilled
      1.3 已失败-rejected
      上面的三种状态一旦发生,就不再改变,任何时候都能得到这个结果。

    2. 无法取消
      一旦新建,就会立刻执行,无法中途取消。

    3. 可以链式调用
      根据这个特点,可以避免回调地狱

    一个简单的例子

    function timeout(ms) { // 返回一个Promise实例
        return new Promise((resolve, reject) => {
            setTimeout(resolve, ms, 'ok') // 当经过ms时间后,事件发生
        })
    }
    
    timeout(100).then((value) => {
        console.log(value) // ok
    })
    

    Promise解决回调地狱

    阅读性不好的callBack hell

    const fs = require('fs')
    let data = ''
    fs.readFile('a.txt', 'utf-8', (err, data_1) => { // 读取文件 a.txt
        if (err) throw err
        data += data_1
        fs.readFile('b.txt', 'utf-8', (err, data_2) => { // 读取文件 b.txt
            if (err) throw err
            data += data_2
            fs.readFile('c.txt', 'utf-8', (err, data_3) => { // 读取文件 c.txt
                if (err) throw err
                data += data_3
                console.log(data_2, data)
            })
        })
    })
    

    用Promise重写

    function read(fileUrl) {
        return new Promise((resolve, reject) => {
            fs.readFile(fileUrl, 'utf-8', (error, data) => {
                error && reject(error)
                resolve(data)
            })
        })
    }
    
    let fileData = ''
    read('a.txt')
    .then((data) => {
        console.log(data, '文件a')
        fileData += data
        return read('b.txt')
    })
    .then((data) => {
        console.log(data, '文件b')
        fileData += data
        return read('c.txt')
    })
    .then((data) => {
        console.log(data, '文件c')
        fileData += data
        console.log(fileData)
    })
    

    .then

    1. 任何时候,then方法都会返回一个新的Promise对象
    2. 如果在then方法中,显式的return一个非Promise对象,那么这个结果就作为下一个then方法的参数
    3. 如果return返回的是一个Promise对象,就作为一个新的Promise对象来使用

    .all, .race

    all生成并返回一个新的Promise对象,当所有的Promise对象都成功之后,执行某些操作。如果某个promise对象变为reject,则Promise.all就会立刻终止,并返回一个reject的新的promise对象
    race是指,在多个Promise对象中,只要有一个成功了,就执行某些操作

    明天还有...

    ---continue---

    相关文章

      网友评论

          本文标题:初识Promise

          本文链接:https://www.haomeiwen.com/subject/rqexpftx.html