如何实现Web请求的编排?

需求:
打开一个网页,页面中有5个连接, 如何保障这些连接按调用顺序请求并依次返回响应.这里不考虑意外因素:网络延时, 某个请求不及时返回,...

示例:
第一步加载主对象. loadProduct. 发起一个加载商品的请求
第二步计算库存. calcProductStock. 发起一个查询该商品库存的请求
...
第五步加载评论. queryProductComment. 发起一个查询该商品评论的请求

其它:
只要能在calcProductStock开始前保证loadProduct响应结束即可,记得在哪看到一时没想起来,好像w3c有一个未落地的规范是关于此的


讨论:
1)w3c相关的规范
2)各种编排方案的优缺点. 发贴前查了一些一个满意的发也没找到,理想的是:对现有请求方法稍微改造一下即可达到想到的效果. 不要对现有代码作太大的改动

阅读 2.5k
2 个回答

用async/await:

async function loadPage() {
  try {
    // 第一步加载主对象
    let product = await loadProduct();
    console.log('Product loaded', product);

    // 第二步计算库存
    let stock = await calcProductStock(product);
    console.log('Stock calculated', stock);

    // ...其他步骤

    // 第五步加载评论
    let comments = await queryProductComment(product);
    console.log('Comments loaded', comments);
  } catch (error) {
    console.error('Error loading page', error);
  }
}

loadPage();

没有留意相关浏览器请求优先级的规范,在我的理解里,W3C 应该不会接入“浏览器请求策略”话题的讨论。

我对你说的“编排”有以下几种理解:

  1. 控制多个请求的顺序:如 B 请求参数以来 A 请求的结果。可以使用 Promise 或者 Async/Await 编写代码控制,这是 JS 日常编码中最常见的部分
  2. 控制多个请求并发的优先级:比如对用一个域名发起 7 次请求,一定会有一个请求会收到浏览器请求并发数限制较慢发出。可以编写全局的请求管理器,并在发起请求时通过参数来控制同一批次内的请求的优先级。可以使用 NativeBird.mapSeries 等并发控制方法。
  3. 请求出错与缓存:如果不想自己编写逻辑,可以尝试 alova 等库。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏