用来显示答案。
首先,脚本要用Axios。
// jsdelivr cdn地址:https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js
let ax = async(url,data)=>{
let config = {};
config.method = "POST";
config.timeout = 16000;
config.responseType = 'json';
config.url = url;
config.data = data;
config.headers = {
'Authorization': window.localStorage.getItem("token")
};
return await axios(config)
}
let getAnswerByTopicId = async(topicId, getParseContent)=>{
topicId = topicId.toString()
let eb = await ax("//api.zsyst.zhixinhuixue.com/exam/edit-basket", {
originType: 1,
type: 1,
topicIds: topicId,
subjectId: 0
})
if (eb.data.status != 1) {
return eb.data.message;
}
let vb = await ax("//api.zsyst.zhixinhuixue.com/exam/view-basket", {
subjectId: 0
})
eb = await ax("//api.zsyst.zhixinhuixue.com/exam/edit-basket", {
topicIds: topicId,
type: 3,
subjectId: 0
})
if (eb.data.status != 1) {
return eb.message;
}
let ans = `${vb.data.data[0].topic_id}: ${vb.data.data[0].correct_answer}`;
if(getParseContent){
return [ans, vb.data.data[0].parse_content]
}
return ans
}
要在登录状态下的主页操作。
这段代码定义了一个异步函数 ax
,该函数使用 axios 库向指定的 URL 发送 POST 请求。该函数的参数 url
和 data
分别表示请求的 URL 和要发送的数据。发送请求时,使用的配置包括请求方法、超时时间、响应类型、URL 和数据,以及请求头部信息。
另一个函数 getAnswerByTopicId
也是异步函数。它会接收两个参数:topicId
和 getParseContent
。函数会将 topicId
转换为字符串,然后使用 ax
函数向指定的 API 发送两个 POST 请求。第一个请求会添加一个试题到篮子里,第二个请求会查看篮子里的试题。如果 API 返回的状态不是 1,则函数会返回 API 返回的错误信息。
如果 API 返回的状态是 1,则函数会返回试题的正确答案。如果 getParseContent
参数为真,则还会返回试题的解析内容。
顺便分享下一种个人觉得很能装逼的写法
[.../* 题目ID */].reduce((promise, n) => promise.then(() => getAnswerByTopicId(n)).then(result => console.log(result)), Promise.resolve());
Array.from({length: /* 题目总数 */}, (v, i) => /* 起始题目ID */ + i).reduce((promise, n) => promise.then(() => getAnswerByTopicId(n)).then(result => console.log(result)), Promise.resolve());
这段代码涉及到的 JavaScript 知识包括:
- 异步函数(async function):使用 async 关键字声明的函数会返回一个 Promise 对象,可以在函数体内使用await 关键字调用异步操作。
reduce
方法(reduce method):用于对数组中的所有元素执行指定的函数,并返回一个值。from
方法(from method):用于创建一个新数组,其中包含指定数目的元素,并使用给定的函数对每个元素进行转换。Promise
对象(Promise object):表示一个异步操作的最终状态(完成或失败)及结果。可以通过then
方法注册回调函数,并使用catch
方法捕获异常。
它们都是使用 reduce
方法对指定的题目 ID 数组进行处理——创建一个题目 ID 的数组,并对数组中的每个元素都执行 getAnswerByTopicId
函数,然后将结果打印到控制台。
第一部分的数组是使用手写的题目 ID 生成的,第二部分的数组是使用 Array.from
方法和手写的参数生成的。
两个部分都是通过 reduce
方法实现的,它们都会对数组中的每个元素执行指定的函数,并将执行结果作为下一次执行的参数。每次执行的函数是 getAnswerByTopicId
,并将执行结果打印到控制台。
两个部分的 reduce
方法的初始值都是一个已被解决的 Promise
对象,即 Promise.resolve()
。这样可以保证第一次执行时不会出错。
在这段代码中,reduce
方法的第一次执行会调用指定的函数,并将结果作为下一次执行的参数。如果初始值不是一个已被解决的 Promise
对象,而是一个等待解决的 Promise
对象,那么在第一次执行时,reduce
方法会尝试将等待解决的 Promise
对象作为参数传递给指定的函数,从而导致错误。
如果使用 Promise.resolve()
方法作为 reduce
方法的初始值,那么第一次执行时,reduce
方法会将一个已被解决的 Promise
对象作为参数传递给指定的函数,这样就可以避免错误。