GM_request

GM_xmlhttpRequest 的 Promise 封装,并增加 retry 功能

이 스크립트는 직접 설치하는 용도가 아닙니다. 다른 스크립트에서 메타 지시문 // @require https://update.greasyfork.org/scripts/565272/1749537/GM_request.js을(를) 사용하여 포함하는 라이브러리입니다.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

(function () {
  function GM_request(details) {
    const {
      onload,
      onerror,
      onretry,
      maxRetries,
      currentRetry = 0,
      ...other
    } = details;
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        onload(response) {
          if (response.status >= 200 && response.status < 300) {
            resolve(response);
          } else {
            reject(
              new Error(
                `Request failed with status ${response.status}: ${response.responseText}`,
              ),
            );
          }
          onload?.(response);
        },
        onerror(error) {
          reject(error);
        },
        ...other,
      });
    }).catch((error) => {
      if (maxRetries && currentRetry < maxRetries) {
        const retryDetails = {
          ...details,
          currentRetry: currentRetry + 1,
        };
        onretry?.(retryDetails);
        return GM_request(retryDetails);
      } else {
        onerror?.(error);
        return Promise.reject(error);
      }
    });
  }
  window.GM_request = GM_request;
})();