初识Promise

2018-07-09  本文已影响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---

上一篇 下一篇

猜你喜欢

热点阅读