Promise学习(1)
Promise学习(1)
异步编程
- 
fs文件操作 require('fs').readFile('./index.html',(err,data)=>{})
- 
数据库操作 
- 
AJAX $.get('/server',(data)=>{})
- 
定时器 setTimeout(()=>{},2000)
Promise之前异步操作全部都用的回掉函数的形式。
为什么要用Promise进行异步操作
- 
指定回掉函数的方式更加灵活(启动异步任务->返回promise对象->给promise对象绑定回调函数) 
- 
支持链式调用,可以解决回调地狱的问题(回掉地狱:不便于阅读,不便于异常处理) 
Promise初体验
    <script>
        function rand(m, n) {
            return Math.ceil(Math.random() * (n - m + 1) + m - 1);
        }
        const btn = document.querySelector('#btn');
        btn.addEventListener('click', function () {
            //回调函数实现
            /* setTimeout(()=>{
                let n = rand(1,100);
                if(n<=30){
                    alert("congralation")
                }else{
                    alert("sorry")
                }
            },2000); */
            //Promise实现
            //resolve和reject都是函数类型的数据
            //封装异步操作
            const p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    let n = rand(1, 100);
                    if (n <= 30) {
                        resolve(n);
                    } else {
                        reject(n);
                    }
                }, 1000);
            })
            //调用then
            p.then((value)=>{
                //成功时候的回调
                alert("congralation,中奖数字为"+value)
            },(reason)=>{
                //失败之后的回调
                alert("sorry,中奖数字为"+reason)
            });
        })
    </script>
Promise封装文件操作
const fs = require('fs');
const { resolve } = require('path');
//fs模块回调函数的形式
fs.readFile('./resource/content.txt',(err,data)=>{
    if(err) throw err;
    console.log(data.toString());
})
//Promise形式
let p = new Promise((resolve,reject)=>{
    fs.readFile('./resource/content.txt',(err,data)=>{
        if(err) reject(err);
        resolve(data);
    })
})
p.then((value)=>{
    console.log(value.toString())
},(reason)=>{
    throw reason
})
Promise封装AJAX
//创建Promise对象
            const p = new Promise((resolve,reject)=>{
                //创建对象
                const xhr = new XMLHttpRequest();
                //初始化
                xhr.open('GET', 'https://api.apiopen.top/getJoke');
                //发送
                xhr.send();
                //处理响应结果
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4) {
                        if(xhr.status>=200&&xhr.status<300){
                            resolve(xhr.response)
                        }else{
                            reject(xhr.status)
                        }
                    }
                }
            })
            p.then((value)=>{
                console.log(value);
            },(reason)=>{
                console(reason)
            })
Promise可以在使用的时候再设定回调函数
/* 
封装一个函数mineReadFile读取文件内容
参数:path文件路径
返回:promise对象
*/
function mineReadFile(path){
    //返回一个对象
    return new Promise((resolve,reject)=>{
        //读取文件
        require('fs').readFile(path,(err,data)=>{
            if(err) reject(err);
            resolve(data);
        });
    });
}
//灵活使用,可以在使用的时候调用回调函数,不需要写任务的时候就指定回调函数
mineReadFile('./resource/content.txt')
.then(value=>{
    console.log(value.toString())
},reason=>{
    console.log(reason)
});
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号