• 13.Promise


    Promise介绍

    Promise是ES6引入的异步编程的新解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

    1. Promise构造函数:Promise(excutor){}
    2. Promise.prototype.then方法
    3. Promise.prototype.catch方法
    //实例化 Promise 对象
    const p = new Promise(function(resolve,reject){
        setTimeout(function(){
            //
            let date = '数据库中的用户数据';
            //resolve
            resolve(data);
            
            let err = '数据读取失败';
            reject(err);
        },1000);
    })
    
    //调用promise对象的then方法
    p.then(function(value){
        console.log(value);//数据库中的用户数据
    },function(reason){
        console.log(reason);//数据读取失败
    })
    

    Promise封装读取文件

    //1.引入fs模块
    const fs = require('fs');
    
    //2.调用方法读取文件
    //fs.readFile('./resources/为学.md',(err,data)=>{
    //	//判断失败 则抛出错误
    //  if(err) throw err;
    //  //如果没有出错,则输出内容
    //	console.log(data.toString());
    //})
    
    //3.使用Promise封装
    const p = new Promise(function(resolve,reject){
        fs.readFile('./resources/为学.md',(err,data)=>{
        	//判断如果失败
            if(err) reject(err);
            //如果成功
            resolve(data)
    	})
    })
    //调用promise对象的then方法
    p.then(function(value){
        console.log(value。toString());
    },function(reason){
        console.log('读取失败');
    })
    

    Promise封装AJAX

    //接口地址 https:api.apiopen.top/getJoke
    
    const p = new Promise((resolve,reject)=>{
    
        //1.创建对象
        const xhr = new XMLHttpRequest();
    
        //2.初始化
        xhr.open('GET',"https:api.apiopen.top/getJoke");
    
        //3.发送
        xhr.send();
    
        //4.绑定事件,处理响应结果
        xhr.onreadystatechange = function(){
            //判断
            if(xhr.readyState === 4){
                //判断响应状态码 200-299
                if(xhr.status >= 200 && xhr.status < 300){
                    //表示成功
                    resolve(xhr.response);
                }else{
                    //如果失败
                    reject(xhr.status);
                }
            }
    
        }
        
    })
    
    //指定回调
    p.then(function(value){
        console.log(value);
    }function(reason){
        console.log(reason);
    })
    
    

    Promise.prototype.then方法

    //创建Promise对象
    const p = new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('用户数据');
            //reject('出错了');
        },1000);
    })
    
    //调用then方法 then方法的返回结果是Proimse对象,对象状态由回调函数的执行结果方法决定
    //1.如果回调函数中返回的结果是 非pormise 类型的属性,状态为成功,返回值为对象的成功的值
    
    const result = p.then(value=>{
        console.log(value);
        //1.非 promise 类型的属性
        return 'iloveyou';
        //2.是 promise对象
        return new Promise((resolve,reject)=>{
            //resolve('ok');
            reject('error');
        })
        //3.抛出错误
        //throw new Error('出错了!');
        throw '出错了';
    },reason=>{
        console.warn(reason);
    })
    
    
    //链式调用
    p.then(value => {
        
    },reason => {
        
    }).then(value => {
        
    },reason => {
        
    })
    

    Promise实践 读取多个文件

    //引入fs模块
    const fs = require('fs');
    
    //调用方法读取文件
    //fs.readFile('./resources/为学.md',(err,data1)=>{
        //fs.readFile('./resources/插秧诗.md',(err,data2)=>{
            //fs.readFile('./resources/观书有感.md',(err,data3)=>{
    			//let result = data1 + '\r\n' + data2 + '\r\n' + data3;
    			//console.log(result);
            //})
        //})
    //})
    
    //使用Promise实现
    const p = new Promise(function(resolve,reject){
        fs.readFile('./resources/为学.md',(err,data)=>{
            resolve(data)
    	})
    })
    
    p.then(value=>{
        return new Promise(function(resolve,reject){
            fs.readFile('./resources/插秧诗.md',(err,data)=>{
                resolve([value,data])
            })
    	})
    }).then(value=>{
        return new Promise(function(resolve,reject){
            fs.readFile('./resources/观书有感.md',(err,data)=>{
                //压入
                value.push(data);
                resolve(value);
            })
    	})
    }).then(value=>{
        console.log(value.join('\r\n'));
    })
    

    Promise.prototype.catch方法

    const p = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            //设置p对象的状态为失败,并设置失败的值
            reject('出错了')
        },1000)
    })
    
    p.then(value=>{},reason=>{
      console.log(reason);
    })
    
    //catch语法糖
    p.catch(reason){
      console.log(reason);
    })
    
  • 相关阅读:
    最小移动次数使数组元素相等
    计算几何
    北校门外的回忆
    洗衣服
    HDU1046:Gridland
    注册机的实现如(istarMenu CORE Keygen)
    是你吗?
    (译)KVO的内部实现
    通过UIColor转换为UIImage
    Palindrome Number 解题报告
  • 原文地址:https://www.cnblogs.com/AaronNotes/p/14367299.html
Copyright © 2020-2023  润新知