Promise

概念

  • Promise 是一个构造函数,既然是构造函数,那么我们就可以通过 new Promise() 得到一个 Promise 实例

  • 在 Promise 上,有两个函数,分别叫做 resolve(成功之后的回调函数) 和 reject(失败之后的回调函数)

  • Promise 表示一个异步操作,当我们 new Promise 实例,这个实例就表示一个具体的异步操作

  • 既然 Promise 创建的实例是一个异步操作,那么这个异步操作的结果,只能有两种状态

    • 状态1:异步执行成功了,需要在内部调用成功的回调函数 resolve ,把结果返回给调用者
    • 状态2:异步执行失败了,需要在内部调用失败的回调函数 reject 把结果返回给调用者
    • 由于 Promise 实例是一个异步操作,所以内部拿到操作的结果后,无法使用 return 把操作结果返回给调用者;这时候,只能使用回调函数的形式,来把成功或失败的结果,返回给调用者
  • 我们可以在 new 出来的 Promise 实例上调用 .then() 方法,预先为这个 Promise 异步操作,指定成功和失败的回调函数

使用

var promise = new Promise()
//这里 new 出来的 Promise 只是代表形式上的一个异步操作(我们知道它是一个异步操作,但具体做什么异步事情,目前还不清楚)
//这是一个具体的异步操作,其中使用 function 指定一个具体的异步操作,每当
// new 一个 Promise 对象的时候,就立即执行这个异步操作中的代码可以用函数封装这个对象,需要的时候才调用
const fs = require('fs')
var promise = new Promise(function(){
    fs.readFile('./1.txt','utf-8',(err,datastr) => {
        if(err) throw err
        console.log(datastr)
    })
})

可以将这个异步操作封装到函数中,再将这个 Promise 实例返回出去

function getFileByPath(fpath){
    return new Promise(function (resolve,reject) {
        fs.readFile(fpath, 'utf-8', (err,dataStr) => {
            if(err) return reject(err)
            resolve(dataStr)
        })
    })
    // return promise
}

解决回调地狱问题,在上一个.then()中,返回一个新的 promise 实例,可以继续用下一个 .then() 来处理

getFileByPath('./11.txt').then(function(data){
    console.log(data)
    return getFileByPath('./2.txt')
},function (err) {
    console.log(err.message)
    return getFileByPath('./2.txt')
}).then(function (data) {
    console.log(data)
    return getFileByPath('./3.txt')
}).then(function(data){
    console.log(data)
})
原文地址:https://www.cnblogs.com/angle-yan/p/12777227.html