Promise 静态 API 的使用方法

简介: Promise 静态 API 的使用方法

Promise.all


使用场景:假设我们希望许多 Promise 并行执行,并等待它们都准备好。


一个实际例子是:并行下载多个 URL,并在这些 URL 全部下载完成后,再进行后续的业务逻辑处理。

语法:


let promise = Promise.all(iterable);


Promise.all 接受一个 iterable 对象(通常是一组 Promise)并返回一个新的 Promise.


当所有列出的 Promise 都 resolve 后,新的 Promise 也将 resolve,并且它们的结果数组成为新的 Promise 对象的结果。


例如,下面的 Promise.all 在 3 秒后状态变为 fulfilled,然后它的结果是一个数组 [1, 2, 3]:


Promise.all([
  new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
  new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
  new Promise(resolve => setTimeout(() => resolve(3), 1000))  // 3
]).then(alert); // 1,2,3 when promises are ready: each promise contributes an array member


请注意,结果数组成员的顺序与其源承诺中的顺序相同。 尽管第一个 Promise 需要最长的时间来解决,但它仍然是结果数组中的第一个。


一个常见的技巧是将一组作业数据映射到一组 Promise 中,然后将其包装到 Promise.all 中。


例如,如果我们有一个 URL 数组,我们可以像这样获取它们:



let urls = [
  'https://api.github.com/users/iliakan',
  'https://api.github.com/users/remy',
  'https://api.github.com/users/jeresig'
];
// map every url to the promise of the fetch
let requests = urls.map(url => fetch(url));
// Promise.all waits until all jobs are resolved
Promise.all(requests)
  .then(responses => responses.forEach(
    response => alert(`${response.url}: ${response.status}`)
  ));


在调试器里,看到 requests 数组最开始的三个元素,状态全是 pending:




看到 requests 变成 状态后,传入 then 的结果数组:


一旦执行到 then 方法之后,状态变为 fulfilled:






一个实际的使用 Promise.all 一次并发读取多个 Github user 记录的例子:


let names = ['iliakan', 'remy', 'jeresig'];
let requests = names.map(name => fetch(`https://api.github.com/users/${name}`));
Promise.all(requests)
  .then(responses => {
    // all responses are resolved successfully
    for(let response of responses) {
      alert(`${response.url}: ${response.status}`); // shows 200 for every url
    }
    return responses;
  })
  // map array of responses into an array of response.json() to read their content
  .then(responses => Promise.all(responses.map(r => r.json())))
  // all JSON answers are parsed: "users" is the array of them
  .then(users => users.forEach(user => alert(user.name)));
相关文章
|
4月前
|
前端开发 小程序 API
【微信小程序】-- 使用 npm 包 - API Promise化(四十二)
【微信小程序】-- 使用 npm 包 - API Promise化(四十二)
|
4月前
|
API Python
邮件发送API使用方法?代码应该怎么编辑
邮件发送API简化了编程式邮件发送,如SendGrid、Mailgun、Amazon SES是常见提供商。获取API密钥后,以Python和SendGrid为例,发送邮件涉及设置API密钥、创建客户端、定义邮件内容及发送。运行代码得到发送响应,确保邮件成功发送。AokSend提供高触达、触发式SMTP/API发信服务。集成API能快速高效地在应用中实现邮件功能。
|
4月前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
119 4
|
2月前
|
前端开发 JavaScript 定位技术
JavaScript 等待异步请求数据返回值后,继续执行代码 —— async await Promise的使用方法
JavaScript 等待异步请求数据返回值后,继续执行代码 —— async await Promise的使用方法
41 1
|
2月前
|
前端开发 小程序 API
【微信小程序】使用 Promise、async 和 await 将异步API 改写为同步
【微信小程序】使用 Promise、async 和 await 将异步API 改写为同步
47 0
|
4月前
|
前端开发 JavaScript
ES6:Promise使用方法解析大全
ES6:Promise使用方法解析大全
|
10月前
|
小程序 前端开发 API
小程序api封装 promise使用
小程序api封装 promise使用
52 0
|
11月前
|
存储 Java API
API及String类和字符串相关使用方法
API及String类和字符串相关使用方法
|
12月前
|
前端开发 API 数据库
Promise.all API 的出错处理
Promise.all API 的出错处理
|
4月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
51 1