Skip to content

Latest commit

 

History

History
50 lines (38 loc) · 1.58 KB

File metadata and controls

50 lines (38 loc) · 1.58 KB

2637. Promise Time Limit

解題程式碼

解法 1.

var timeLimit = function (fn, t) {
  return async function (...args) {
    return new Promise((resolve, reject) => {
      let timeId = setTimeout(() => {
        reject('Time Limit Exceeded');
      }, t);

      // fn(...args)
      //   .then((res) => resolve(res))
      //   .catch((err) => reject(err))
      //   .finally(() => clearTimeout(timeId));
      fn(...args).then(resolve).catch(reject).finally(() => clearTimeout(timerId));
    });
  };
};

看題目描述會需要處理到非同步函式的 resolve、reject 情況,只要超過時間限制就會 reject,這種情況可以想到使用 Promise,所以解法 1 中去 return 一個 Promise,裡面就可以處理 resolve、reject,reject 會在時間限制到時觸發,而 resolve 就依照非同步的 fn 處理。

解法 2.

var timeLimit = function (fn, t) {
  return async function (...args) {
    const promiseFn = fn(...args);
    const timeLimitPromise = new Promise((_, reject) => {
      setTimeout(() => {
        reject('Time Limit Exceeded');
      }, t);
    });

    return Promise.race([promiseFn, timeLimitPromise]);
  };
};

解題思路、演算法

解法 2 使用 Promise.race(),它接受一個包含 Promise 當作元素的陣列,只回傳傳入的 Promie 陣列中第一個被 resolve/reject 的 Promise 物件。所以我們將原本的非同步函式、會 reject 的 Promise 物件加到 Promise.race() 內,先執行完成的 Promise 就會被回傳。

解法的時間、空間複雜度

參考資料