边缘程序ER的每个请求都有严格的生命周期。本文举例说明,为您详细介绍ER的生命周期。

生命周期介绍

对于Fetch事件,您的请求上下文会在event.respondWith的回复对象被完全发送后,并在CDN架构中指回给CDN网关后该请求上下文才会被终止。
说明 终止是指所有还未结束的子请求将会被取消,所有已分配的资源如果能回收均会被回收,但不会销毁您的JS虚拟机。

举例说明

以下代码示例表示第一次发起的Fetch可能还未执行完,hello world已经被ER发回给了CDN网关,此时未执行的Fetch会被取消,即您无法确定Fetch是否已经执行完毕。
addEventListener('fetch', (event) => {
  event.respondWith(handle(event));
});

async function handle(event) {
  // 1.异步发起一个fetch请求,但是我们不使用await,所以该请求会并行于我们的JS代码。
  fetch("http://www.aliyun.com/data", {body: "this is my log", method: "POST"});
  
  // 2.立刻发起回复。注意,这个回复hello world发回给客户端时,前面发起的fetch可能没有执行
  //    完毕。
  return "hello world";
}
为了保证某个Promise一定被执行完毕或执行超时,您可以使用event.waitUntil函数。event.waitUntil函数可以保证某个请求上下文发起的异步Fetch请求在主请求回复完毕后执行完毕。具体见以下代码示例:
addEventListener('fetch', (event) => {
  event.respondWith(handle(event));
});

async function handle(event) {
  // 1. 异步发起一个fetch请求。我们不用await,而是使用event.waitUntil去保证这个fetch即使
  //    在回复了主请求后依然执行,或者直到整个请求上下文超时为止。
  event.waitUntil(
    fetch("http://www.aliyun.com/data", {body: "this is my log", method: "POST"}));
  
  // 2. 立刻发起回复。注意,这个回复hello world发回给客户端时,前面发起的fetch会被保证
  //    执行,即使我们回复了请求。
  return "hello world";
}
上述示例中的event.waitUntil会保证Fetch被执行,同时您也可以多次调用waitUntil函数去等待多个Promise被执行,所有等待的Promise中如果有一个异常,则无法保证其他所有的Promise被继续执行。
注意 waitUntil不能违背资源限制,如果资源违规,则该请求也会被终止。