如果您只对 Promise.all 感兴趣,请阅读下面的 Promise.all
Promise(通常称为“Promise”)- 提供一种方便的方式来组织异步代码。
Promise - 是一个包含您的状态的特殊对象。最初,待处理(“等待”),然后是以下之一:已完成(“成功”)或被拒绝(“错误完成”)。
关于挂起回调的承诺可以有两种:
- unFulfilled - 当 Promise 处于“完成”状态时触发
成功。”
- Rejected - 当 promise 在“made in error”时触发。
创建 Promise 的语法:
var promise = new Promise(function(resolve, reject) {
// This function will be called automatically
// It is possible to make any asynchronous operations,
// And when they will end - you need to call one of:
// resolve(result) on success
// reject(error) on error
})
挂起处理程序的通用方法:
promise.then(onFulfilled, onRejected)
在它的帮助下,您可以同时分配一个处理程序,并且只分配一个:
// onFulfilled It works on success
promise.then(onFulfilled)
// onRejected It works on error
promise.then(null, onRejected)
同步抛出 - 与拒绝相同
'use strict';
let p = new Promise((resolve, reject) => {
// то же что reject(new Error("o_O"))
throw new Error("o_O");
});
p.catch(alert); // Error: o_O
承诺
Promisification - 当采用异步功能并使其成为返回 PROMIS 的包装器时。
Promisification 之后函数的使用通常会变得更加方便。
例如,为使用 XMLHttpRequest 请求制作一个包装器
httpGet 函数 (url) 将返回 PROMIS,在成功加载数据后,该 url 将与这些数据一起完成,如果出现错误 - 将被拒绝并显示错误信息:
function httpGet(url) {
return new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function() {
if (this.status == 200) {
resolve(this.response);
} else {
var error = new Error(this.statusText);
error.code = this.status;
reject(error);
}
};
xhr.onerror = function() {
reject(new Error("Network Error"));
};
xhr.send();
});
}
如您所见,在函数内部 XMLHttpRequest 对象像往常一样被创建和发送,当 onload / onerror 被分别调用时,分别解析(状态为 200)或拒绝。
使用:
httpGet("/article/promise/user.json")
.then(
response => alert(`Fulfilled: ${response}`),
error => alert(`Rejected: ${error}`)
);
并行执行
如果我们想同时实现多个异步进程并处理它们的结果怎么办?
Promise 类具有以下静态方法。
Promise.all(iterable)
调用 Promise.all (iterable) 接收一个数组(或其他可迭代对象)并返回 PROMIS PROMIS,它会等待直到所有传输的 PROMIS 完成,并通过结果数组更改为“完成”状态。
例如:
Promise.all([
httpGet('/article/promise/user.json'),
httpGet('/article/promise/guest.json')
]).then(results => {
alert(results);
});
假设我们有一个 URL 数组。
let urls = [
'/article/promise/user.json',
'/article/promise/guest.json'
];
要并行下载它们,您需要:
- 为每个与 PROMIS 对应的 URL 创建。
- 在 Promise.all 中包装一个 PROMIS 数组。
我们得到这个:
'使用严格';
let urls = [
'/article/promise/user.json',
'/article/promise/guest.json'
];
Promise.all( urls.map(httpGet) )
.then(results => {
alert(results);
});
请注意,如果任何 Promise 以错误结束,结果将
Promise.all 这个错误。
同时忽略 PROMIS 的其余部分。
例如:
Promise.all([
httpGet('/article/promise/user.json'),
httpGet('/article/promise/guest.json'),
httpGet('/article/promise/no-such-page.json') // (нет такой страницы)
]).then(
result => alert("не сработает"),
error => alert("Ошибка: " + error.message) // Ошибка: Not Found
)
总共:
- Promise - 是一个特殊的对象,用于存储其状态,即当前
结果(如果有)和回调。
- 当你创建一个新的 Promise ((resolve, reject) => ...) 函数时
参数自动启动,它应该调用 resolve (result) on
成功,然后拒绝(错误) - 错误。
- 参数解析/拒绝(仅第一个,其余的被忽略)
在这个 Promise 上传递给处理程序。
- 通过调用 .then / catch 指定处理程序。
- 使用 Channing 将结果从一个处理器传输到另一个处理器。
https://www.promisejs.org/patterns/