乐趣区

关于javascript:Promise理解

Promise

理解概念:回调函数。函数被当做参数且满足肯定条件后是回调函数

setTimeout(function(){console.log("3s 后执行回调函数"); // 函数参数就是回调函数
},3000);

异步工作:不阻塞前面工作的执行。跨栏式执行叫做异步工作。

const p = new Promise(function(resolve,reject){
    setTimeout(function(
              let data = "从数据库 \ 网络取得数据";
              resolve(data);
              let err = "取得数据失败";
              reject(err);
              ),3000);
});

p.then(function(value){console.log("");
},function(reason){})
// promise 封装读取文件 readFile 异步函数
// promise 封装这种慢动作十分有用
const fs = require("fs");
const p = new Promise(function(resolve,reject){fs.readFile("./resouse/ 为学.md",(err,data)=>{if(err) reject(err); // 失败
        resolve(data); // 胜利
    });
});

p.then(function(value){console.log(value.toString());
},function(reason){console.err("读取失败");
})
// promise 封装 Ajax/http 申请
const p = new Promise(function(resolve,reject){
    // 1.Ajax 创建对象
    const xhr = new XMLHttpRequest();
    // 2. 初始化
    xhr.open("GET","https://api.apiopen.top/getJoke");
    // 3. 发送
    xhr.send();
    // 4. 绑定事件, 解决响应后果
    xhr.onreadystatechange = function(){if(xhr.readyState = 4){if(xhr.status >=200 && xhr.status<300){console.log(xhr.response);
            }else{console.error(xhr.status);
            }
        }
    }
});

Promise.then() 办法

// 1. 先创立一个 promise 对象
const p = new Promise((resolve,reject)=>{setTimeout(()=>{resolve("ok"); // 这条语句是设置 p 对象的状态为胜利 并且能够设置 PromiseValue 为 ok
    },1000)
});

// 2.then 办法的返回对象也是 promise 对象 result 是对象
const result = p.then((value)=>{
    // 如果 return 的不是 promise 对象,则 result 的状态固定是 resolve 类型的 promise
    // 如果 return 的是 promise 对象, 则 result 的状态和 return 的 promise 对象保持一致
    // 如果没有 return,而是 throw,则 result 的状态固定是 rejected 类型的 promise
    return "123"; // 此时 result 就是 resolve 的 promise 对象
    return new Promise((resolve,reject) =>{ // 此时 result 就是 return 回的新的 promise 对象
        resolve("ok");
    })
    throw "...";
},(reason)=>{})
// Promise 对象
Promise{
    PromiseStatus : "resolved",
    PromiseValue  : "ok",
}

因为 .then 能够返回 promise 对象,所以 .then() 能够进行链式回调。这种链式回调解决了回调天堂的问题

p.then((value)=>{// 异步工作 1},(reason)=>{}).then((value)=>{// 异步工作 2},(reason)=>{}).then((value)=>{// 异步工作 3})

Promise是对一般异步的一种封装,这是一种优化对象,没有 promise 也能够用,只是有了能够解决诸如回调天堂的问题

Promise.catch() 办法

.catch其实是一种非凡的 .then() 办法,专门用来做 Promise 对象为 rejected 的时候所做的解决;省略了 .then 中第一个回调参数(value)=>{}

.catch((err)=>{ // 最大的用途就是这
    console.log(err);
})
退出移动版