Promise

最后更新于:2022-04-02 03:27:32

[TOC] ## Promise ``` var promise = new Promise(function (resolve, reject) { // ... if (/* 异步操作成功 */){ resolve(value); } else { /* 异步操作失败 */ reject(new Error()); } }); promise.then(function (e) { console.log(e); }).catch(function (e) { console.log(e); }) ``` ### 简单实例 ``` // ajax函数将返回Promise对象: function ajax(method, url, data) { var request = new XMLHttpRequest(); return new Promise(function (resolve, reject) { request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { resolve(request.responseText); } else { reject(request.status); } } }; request.open(method, url); request.send(data); }); } //执行 var p = ajax('GET', '/api/categories'); p.then(function (text) { // 如果AJAX成功,获得响应内容 console.log(text); }).catch(function (status) { // 如果AJAX失败,获得响应代码 console.log(text); }); ``` 在 ES6 中使用 ``` var func = new Promise((resolve,reject)=>{ fs.readFile("./demo.html", (err, data)=> { if (err) reject(err) else resolve(data) }) }) func.then(data=>{ console.log(data); }).catch((err)=>{ console.log(err); }); ``` ### Promise.all 等到都完成 ### Promise.race 有一个完成 ``` var p1 = new Promise(function (resolve, reject) { setTimeout(resolve, 500, 'P1'); }); var p2 = new Promise(function (resolve, reject) { setTimeout(resolve, 600, 'P2'); }); // 同时执行p1和p2,并在它们都完成后执行then: Promise.all([p1, p2]).then(function (results) { console.log(results); // 获得一个Array: ['P1', 'P2'] }); //只需要获得先返回的结果即可,增加容错,如同时向两个URL读取用户的个人信息 Promise.race([p1, p2]).then(function (result) { console.log(result); // 'P1' }); ```
';