关于javascript:ES6Promise

一、简介
Promise是异步编程的一种解决方案,简略说就是一个容器,外面保留着某个将来才会完结的事件(通常是一个异步操作)的后果。从语法上说,Promise是一个对象,从它能够获取异步操作的音讯。
两个特点:
1、对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:

pending-进行中
fulfilled-已胜利
rejected-已失败

只有异步操作的后果能够决定以后是哪一种状态,任何其余操作都无奈扭转这个状态。
2、一旦状态扭转,就不会再变,任何时候都能够失去这个后果。
只有两种状态扭转,

pending-->fulfilled
pending-->rejected

只有这两种状况产生,状态就凝固了,不会再变,会始终保留这个后果,这时就称为resolved(已定型)。若扭转曾经产生了,再对Promise对象增加回调函数,也会立刻失去后果。这与事件Event不同,事件的特点是,如果错过了,再去监听,是得不到后果的。

二、根本用法
Promise构造函数承受一个函数作为参数,该函数的两个参数别离是resolve和reject。它们是两个函数,有js引擎提供,不必本人部署。
resolve函数在异步操作胜利时调用,将异步操作的后果作为参数传递进来。同时将Promise的状态从pending变成fulfilled。
reject函数在异步操作失败时调用,将异步操作失败报出的谬误作为参数传递进来。同时将Promise状态从pending变成rejected。

const promise = new Promise((resolve,reject)=>{
    if (/*异步操作胜利*/) {
        resolve(value)
    } else {
        reject(error)
    }
})

promise实例生成当前,能够用then办法,then()的两个参数别离指定resolved和rejected状态的回调函数。两个参数都是可选的,它们都承受Promise对象传出的值作为参数。

promise.then((value)=>{
    /*success*/
},(error)=>{
    /*failure*/
})

实例:

const timeout = (ms)=>{
    return new Promise((resolve,reject)=>{
        setTimeout(resolve, ms, 'done')/*setTimeout()第三个参数为传给执行函数的其余参数,因而在ms秒后,将'done'作为参数传入resolve函数并执行*/
    })
}

timeout(1000).then((value)=>{//timeout函数返回一个Promise实例,示意一段时间后才会产生的后果。过了指定工夫ms后,promise实例的状态从pending变成resolved,就会触发then办法绑定的回调函数
    console.log(value)  //'done'
})

promise的执行程序:
promise新建后就会立刻执行,then()指定的回调函数,将在以后脚本所有同步工作实现才会执行。

let promise = new Promise((resolve,reject)=>{
    console.log('promise');
    resolve()
})

promise.then(()=>{
    console.log('resolved')
})
console.log('Hi')  
//'promise'
//'Hi'
//'resolved'

用Promise封装一个异步交互

function myAsyncFun(url){
    return new Promise((resolve,reject)=>{
        cosnt xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.onload = ()=> resolve(xhr.responseText);
        xhr.onerror = ()=> reject(xhr.statusText);
        xhr.send();
    })
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理