解法 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 就會被回傳。