Skip to content

Promise

Promise用途

1、异步计算 2、异步操作队列化 3、对象之间传递和操作Promise

异步产生的原因

1、JavaScript为检查表单而生 2、首要目标数是操作DOM 3、JavaScript操作大多是异步的

异步操作常见语法

1、事件侦听与响应

js
// 1、原生事件绑定
document.getElementById("start").addEventListener('click', start, false);
function start(){
    // 响应事件处理操作
}

// 2、jQuery事件绑定
$('#start').on('click', start);

2、回调

js
// 1、ajax请求
$.ajax('http://www.baidu.com', {
    success: function(res){
        // 回调函数
    }
})

// 2、页面加载完成之后
$(function(){
    // 回调函数
});

浏览器中的JavaScript

1、异步操作以事件为主 2、回调主要出现在Ajax和File API

异步回调问题

1、嵌套层次较深,回调地狱 2、无法处理异常,不能正常return和throw 3、无法正常检索堆栈信息, 闭包变量可能被修改 4、多个回调之间难以建立联系

Promise

Promise是一个代理对象,和原先要进行的操作无关系 通过引入一个回调,避免更多的回调

js
new Promise(
    // 执行器 executor
    function(resolve, reject){
        // 耗时操作
        resolve(); // 数据处理完成
        reject();  // 数据处理出错
    }).then(function A(){
// 成功,下一步
    }, function B(){
// 失败,做相应处理
    })

Promise3个状态

1、pendding 待定,初始状态 2、fulfilled 实现,操作成功 3、rejected 被否决,操作失败

Promise状态发生改变,就会触发.then()里的响应函数 Promise状态只会改变一次 Promise实例一经创建,执行器立即执行

代码实例

js
// 定时执行
console.log("hi")
new Promise(resolve => {
    setTimeout(()=>{
        resolve("hello");
    }, 1000);
}).then(value=>{
    console.log(value + " world");
})
/*
hi
hello world
*/
js
// 两步执行
console.log("hi")
new Promise(resolve => {
    setTimeout(()=>{
        resolve("hello");
    }, 1000);
}).then(value=>{
    console.log(value);
    return new Promise(resolve=>{
        setTimeout(()=>{
        resolve("world");
    }, 1000);
    })
}).then(value=>{
    console.log(value + " world");
})
/*
hi
hello
world world
*/
js
// 队列
console.log("hi")

let promise = new Promise(resolve=>{
    setTimeout(()=>{
        console.log('promise')
        resolve('hello world');
    }, 1000)
});

setTimeout(()=>{
    promise.then(value=>{
       console.log(value) 
    })
}, 1000);
/*
hi
promise
hello world
*/

then()

1、.then() 接受两个函数作为参数,分别代表fulfilled和rejected 2、.then() 返回新的Promise实例,可以链式调用 3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行 4、状态响应函数可以返回新的Promise,或其他值 5、如果返回新的Promise,那么下一级.then()会在新的Promise状态改变之后执行 6、如果返回其他任何值,则会立刻执行下一级.then()