mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2026-04-11 19:36:54 +00:00
106 lines
3.2 KiB
JavaScript
106 lines
3.2 KiB
JavaScript
// ==UserScript==
|
||
// @name Fetch API示例解析器
|
||
// @type fetch_demo
|
||
// @displayName Fetch演示
|
||
// @description 演示如何在ES5环境中使用fetch API和async/await
|
||
// @match https?://example\.com/s/(?<KEY>\w+)
|
||
// @author QAIU
|
||
// @version 1.0.0
|
||
// ==/UserScript==
|
||
|
||
// 使用require导入类型定义(仅用于IDE类型提示)
|
||
var types = require('./types');
|
||
/** @typedef {types.ShareLinkInfo} ShareLinkInfo */
|
||
/** @typedef {types.JsHttpClient} JsHttpClient */
|
||
/** @typedef {types.JsLogger} JsLogger */
|
||
|
||
/**
|
||
* 演示使用fetch API的解析器
|
||
* 注意:虽然源码中使用了ES6+语法(async/await),但在浏览器中会被编译为ES5
|
||
*
|
||
* @param {ShareLinkInfo} shareLinkInfo - 分享链接信息
|
||
* @param {JsHttpClient} http - HTTP客户端(传统方式)
|
||
* @param {JsLogger} logger - 日志对象
|
||
* @returns {string} 下载链接
|
||
*/
|
||
function parse(shareLinkInfo, http, logger) {
|
||
logger.info("=== Fetch API Demo ===");
|
||
|
||
// 方式1:使用传统的http对象(同步)
|
||
logger.info("方式1: 使用传统http对象");
|
||
var response1 = http.get("https://httpbin.org/get");
|
||
logger.info("状态码: " + response1.statusCode());
|
||
|
||
// 方式2:使用fetch API(基于Promise)
|
||
logger.info("方式2: 使用fetch API");
|
||
|
||
// 注意:在ES5环境中,我们需要手动处理Promise
|
||
// 这个示例展示了如何在ES5中使用fetch
|
||
var fetchPromise = fetch("https://httpbin.org/get");
|
||
|
||
// 等待Promise完成(同步等待模拟)
|
||
var result = null;
|
||
var error = null;
|
||
|
||
fetchPromise
|
||
.then(function(response) {
|
||
logger.info("Fetch响应状态: " + response.status);
|
||
return response.text();
|
||
})
|
||
.then(function(text) {
|
||
logger.info("Fetch响应内容: " + text.substring(0, 100) + "...");
|
||
result = "https://example.com/download/demo.file";
|
||
})
|
||
['catch'](function(err) {
|
||
logger.error("Fetch失败: " + err.message);
|
||
error = err;
|
||
});
|
||
|
||
// 简单的等待循环(实际场景中不推荐,这里仅作演示)
|
||
var timeout = 5000; // 5秒超时
|
||
var start = Date.now();
|
||
while (result === null && error === null && (Date.now() - start) < timeout) {
|
||
// 等待Promise完成
|
||
java.lang.Thread.sleep(10);
|
||
}
|
||
|
||
if (error !== null) {
|
||
throw error;
|
||
}
|
||
|
||
if (result === null) {
|
||
throw new Error("Fetch超时");
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 演示POST请求
|
||
*/
|
||
function demonstratePost(logger) {
|
||
logger.info("=== 演示POST请求 ===");
|
||
|
||
var postPromise = fetch("https://httpbin.org/post", {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json"
|
||
},
|
||
body: JSON.stringify({
|
||
key: "value",
|
||
demo: true
|
||
})
|
||
});
|
||
|
||
postPromise
|
||
.then(function(response) {
|
||
return response.json();
|
||
})
|
||
.then(function(data) {
|
||
logger.info("POST响应: " + JSON.stringify(data));
|
||
})
|
||
['catch'](function(err) {
|
||
logger.error("POST失败: " + err.message);
|
||
});
|
||
}
|