Promise

2019-01-19  本文已影响0人  秘果_li

Promise是JavaScript中的异步抽象处理对象,是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法之外的写法都会出错

Promises/A+ 规范

  1. Promise的状态
    一个Promise的当前状态必须是以下三种状态中的一种:
  1. Then 方法
    一个 promise 必须提供一个 then 方法用来访问其当前值、终值和据因
    then 方法可以被同一个 promise 调用多次
    then方法必须返回一个promise对象
var promise = getAsyncPromise("fileA.txt"); 
promise.then(function(result){
    // 获取文件内容成功时的处理
}).catch(function(error){
    // 获取文件内容失败时的处理
});

----
返回promise对象
  1. onFulfilled 和 onRejected
    onFulfilled 和 onRejected 都是可选参数

(onFulfilled 和 onRejected 必须被作为函数调用(即没有 this 值))


创建XHR的promise对象
  1. 创建一个用Promise把XHR处理包装起来的名为 getURL 的函数
    用例来源:http://liubin.org/promises-book/#how-to-write-promise
function getURL(URL) {
    return new Promise(function (resolve, reject) {
        var req = new XMLHttpRequest();
        req.open('GET', URL, true);
        req.onload = function () {
            if (req.status === 200) {
                resolve(req.responseText);
            } else {
                reject(new Error(req.statusText));
            }
        };
        req.onerror = function () {
            reject(new Error(req.statusText));
        };
        req.send();
    });
}
// 运行示例 成功
var URL = "http://httpbin.org/get";
getURL(URL).then(function onFulfilled(value){
    console.log(value);
}).catch(function onRejected(error){
    console.error(error);
});

示例运行结果

{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7", "Connection": "close", "Host": "httpbin.org", "Origin": "http://liubin.org", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" }, "origin": "111.18.89.73", "url": "http://httpbin.org/get" }
// 运行示例 失败
var URL = "http://httpbin.org/status/500"; 
getURL(URL).then(function onFulfilled(value){
    console.log(value);
}).catch(function onRejected(error){ 
    console.error(error);
});

示例运行结果

Error: INTERNAL SERVER ERROR

getURL 只有在通过XHR取得结果状态为200时才会调用 resolve - 也就是只有数据取得成功时,而其他情况(取得失败)时则会调用 reject 方法

  1. 编写promise对象处理方法

.then方法可以传入要调用的函数,为了方便理解函数通常命名为 onFulfilled
.catch方法可以传入要调用的函数,通常命名为 onRejected

Promise的基本写法总结

注:

Promise.resolve可以认为是 new Promise() 方法的快捷方式

Promise.resolve(1)

等价于

new Promise(function(resolve){
    resolve(1);
});

方法 Promise.resolve(value); 的返回值也是一个promise对象,所以可以接着对其返回值进行 .then 调用。

Promise.resolve(1).then(function(value){
    console.log(value);
});
上一篇下一篇

猜你喜欢

热点阅读