代码之家  ›  专栏  ›  技术社区  ›  Jojo Narte

从外在承诺到内在承诺的传播拒绝

  •  1
  • Jojo Narte  · 技术社区  · 6 年前

    我创造了一个长跑 Promise 我用这个简单的函数来包装它,我创建了一个手表 承诺 比赛。

    功能如下:

    export const promiseTimeout = (
      promise,
      timeoutMs = 10000, //10 secs
      message = 'Timeout reached, please try again',
    ) =>
      Promise.race([
        promise,
        new Promise((resolve, reject) =>
          setTimeout(() => {
            reject(message);
          }, timeoutMs),
        ),
      ]);
    

    我计划使用它的方式是我将通过长跑 承诺 这可能需要其他不可预知的资源,如internet、文件、系统设置等。

    用法如下: const result = await promiseTimeout(longRunningFunction()) .catch(err => /* do something with the error , show toast or alert */);;

    当前的情况是,每当达到超时时,它都会调用catch,但是

    如何停止对已通过的进程的操作 是否达到超时?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Benjamin Gruenbaum    6 年前

    如果达到超时,如何停止参数中传递的承诺的操作?

    don't have cancellation of async functions yet .

    承诺是一种价值,而不是一种行动 ,一旦您得到了给定的承诺,我们在JavaScript中就不会有可取消的承诺,因此不可能取消操作。

    你唯一能做的就是 the cancellation proposal 写下你的 longRunningFunction 使用令牌:

    function longRunningFunction() {
       const signal = { requested: false };
       async function internal() {
         // your regular code here
         // whenever you can stop execution:
         if(signal.requested) {
           return; // and cancel internal operations
         }
       }
       let res = internal();
       res.signal = signal;
       return res;
    }
    

    然后写下你的种族:

    export const promiseTimeout = (
      promise,
      timeoutMs = 10000, //10 secs
      message = 'Timeout reached, please try again',
    ) =>
      Promise.race([
        promise,
        new Promise((resolve, reject) =>
          setTimeout(() => {
            reject(message);
            if (promise.signal) promise.signal.requested = true;
          }, timeoutMs),
        ),
      ]);