参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
一、概述
ECMAscript 6 原生提供了 Promise 对象。
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
一个 Promise
必然处于以下几种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
待定状态的 Promise 对象要么会通过一个值被兑现(fulfilled),要么会通过一个原因(错误)被拒绝(rejected)。
当这些情况之一发生时,我们用 promise 的 then 方法排列起来的相关处理程序就会被调用。
如果 promise 在一个相应的处理程序被绑定时就已经被兑现或被拒绝了,那么这个处理程序就会被调用,
因此在完成异步操作和绑定处理方法之间不会存在竞争状态。
二、构造函数
Promise
构造器主要用于包装不支持promise(返回值不是Promise
)的函数。
我们通过new
关键字和Promise
构造器创建它的对象。这个构造器接受一个名为"executor function"的函数。
这个函数应当接受两个函数参数。
当异步任务成功时,第一个函数(resolve
)将被调用,并返回一个值代表成功。
当其失败时,第二个函数(reject
)将被调用,并返回失败原因(失败原因通常是一个error对象)。
const myFirstPromise = new Promise((resolve, reject) => { // do something asynchronous which eventually calls either: // // resolve(someValue) // fulfilled // or // reject("failure reason") // rejected });
三、接口请求测试
<!DOCTYPE html> <html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head>
<body> <script> requestUrl("http://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/4326").then(res => { alert(res); }).catch(err => { alert(err); }) function requestUrl(url) { let promise = new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); var method = "GET"; xhr.open(method, url, true); xhr.onload = function () { if (xhr.status === 200) { resolve(xhr.response); console.log(xhr.responseText) } else { reject(xhr.responseType); } } xhr.onerror = function () { reject(Error('There was a network error.')); } xhr.send(); }) return promise;
}
</script> </body>
</html>
四、静态方法
五、并发请求测试
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script>
let urls=["http://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/4326", "http://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/32650", "http1://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/32649错误的url", "http://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/32649查询出错", "http://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/4490", "http://123.56.67.147:3312/cesiumdemo/projConvert/getSpatialBySRID/3857"];let promises=[]; urls.forEach(v=>promises.push(requestUrl(v))); Promise.allSettled(promises).then(results=>{ console.log(results); }).catch(err=>{ alert(err); }) function requestUrl(url) { let promise = new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); var method = "GET"; xhr.open(method, url, true); xhr.onload = function () { if (xhr.status === 200) { resolve(xhr.response); console.log(xhr.responseText) } else { reject(xhr.responseType); } } xhr.onerror = function () { reject(Error('There was a network error.')); } xhr.send(); }) return promise; } </script> </body> </html>
返回结果:
-