来自公众号:前端真好玩
大家肯定遇到过这样类似的场景:多个 Tab 页点击切换功能,如果用户点击频繁,很可能会出现。因为每个接口返回信息的时间是不同的,你不能保证先请求的一定最先返回数据,那么就很可能会出现停留在页面一却出现别的页面的数据的情况。这种异步的情况术语称之为异步竞态。这时肯定有读者会说了,这还不简单,我能给你轻松想出好几个解决办法。节流、防抖、加 Loading!这些做法固然能解决问题,但是都治标不治本,而且还影响了用户体验,其实还有种办法能够完美解决问题:取消请求。当然了这个取消请求它只是不继续处理接口后续的响应了,并不是真的把请求给取消了。毕竟请求如果已经发出去的话,我们也不能顺着网线把它追回来。我们这边以 axios 为例来看看怎么取消请求:
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// handle error
}
});
axios.post('/user/12345', {
name: 'new name'
}, {
cancelToken: source.token
})
// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');
123456789101112131415161718192021123456789101112131415161718192021
用法还是挺简单的,对于可能会出现异步竞态的情况下大家可以采用这个方法来解决。简单好用,还不会影响用户体验,封装下代码就能用起来了。
当今互联网时代,HTML 和 Markdown 都是非常流行的标记语言。HTML 用于构建网页结构和内容,而 Markdown 则以其简洁易读的语法被广泛用于编写文档、博客文章等。在很多场景下,我们需要将 HTML 内容转换为 Markdown 格式,例如网页内容抓取、文档格式转换等。
Rust 作为一门以安全、性能和可靠性著称的系统级编程语言,也提供了相应的库来处理 HTML 到 Markdown 的转换。本文将介绍一个名为 htmd 的 Rust 库,它提供了一种高效且易于使用的方式来完成这项任务。
htmd 是一个受 JavaScript 库 turndown.js 启发而开发的 Rust 库,用于将 HTML 文档转换为 Markdown 格式。它具有以下特点:
在使用 htmd 之前,我们需要先安装它。将以下依赖项添加到你的 Cargo.toml 文件中:
[dependencies]
htmd = "0.1"
基本转换
使用 htmd 进行 HTML 到 Markdown 的基本转换非常简单。以下代码展示了如何将一个 <h1> 标签转换为 Markdown 中的 # 标题:
use htmd::HtmlToMarkdown;
fn main() {
let markdown = HtmlToMarkdown::new();
let html = "<h1>这是一个标题</h1>";
let result = markdown.convert(html).unwrap();
assert_eq!(result, "# 这是一个标题\n");
}
跳过标签
在某些情况下,我们可能希望跳过 HTML 文档中的某些标签,例如 <script> 和 <style> 标签。htmd 提供了 skip_tags 方法来实现这一点:
use htmd::HtmlToMarkdown;
fn main() {
let markdown = HtmlToMarkdown::builder()
.skip_tags(vec!["script", "style"])
.build();
let html = r#"
<script>
// 一些 JavaScript 代码
</script>
<h1>这是一个标题</h1>
"#;
let result = markdown.convert(html).unwrap();
assert_eq!(result, "# 这是一个标题\n");
}
自定义标签处理器
htmd 允许我们自定义标签处理器来处理特定的 HTML 标签。例如,我们可以定义一个处理器将 <img> 标签转换为 Markdown 中的图片语法:
use htmd::{HtmlToMarkdown, HandleResult};
use html5ever::tendril::StrTendril;
use html5ever::QualName;
fn main() {
let markdown = HtmlToMarkdown::builder()
.add_handler(
vec!["img"],
|el| {
let src = el
.attrs
.iter()
.find(|(name, _)| name.local.as_ref() == "src")
.map(|(_, value)| value.as_ref());
let alt = el
.attrs
.iter()
.find(|(name, _)| name.local.as_ref() == "alt")
.map(|(_, value)| value.as_ref());
match (src, alt) {
(Some(src), Some(alt)) => Some(format!("", alt, src)),
_ => None,
}
},
)
.build();
let html = r#"<img src="https://example.com/image.jpg" alt="图片描述">"#;
let result = markdown.convert(html).unwrap();
assert_eq!(result, "\n");
}
多线程处理
htmd 支持多线程处理,可以充分利用多核 CPU 的性能来加速转换过程。以下代码展示了如何使用多线程将多个 HTML 文档转换为 Markdown:
use htmd::HtmlToMarkdown;
use std::sync::Arc;
use std::thread;
fn main() {
let markdown = Arc::new(HtmlToMarkdown::new());
let html_docs = vec![
"<h1>文档 1</h1>",
"<h2>文档 2</h2>",
"<h3>文档 3</h3>",
];
let threads: Vec<_> = html_docs
.into_iter()
.map(|html| {
let markdown = markdown.clone();
thread::spawn(move || {
let result = markdown.convert(html).unwrap();
println!("{}", result);
})
})
.collect();
for thread in threads {
thread.join().unwrap();
}
}
htmd 是一个功能强大且易于使用的 Rust 库,用于将 HTML 文档转换为 Markdown 格式。它提供了丰富的选项、自定义标签处理器和多线程支持,可以满足各种转换需求。如果你正在寻找一种高效可靠的 HTML 到 Markdown 转换解决方案,htmd 绝对值得一试。
法1:使用onclick事件
<input type="button" value="按钮" onclick="javascrtpt:window.location.href='http://www.baidu.com/'" />
或者直接使用button标签
<button onclick="window.location.href = 'https://www.baidu.com/'">百度</button>
方法2:在button标签外套一个a标签
<a href="http://www.baidu.com/"> <button>百度</button> </a>
或使用
<a href="http://www.baidu.com/"><input type="button" value='百度'></a>
方法3:使用JavaScript函数
*请认真填写需求信息,我们会在24小时内与您取得联系。