- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 Google 搜索结果创建一个网络扫描仪。我希望用户能够在搜索结果时暂停程序。最初我尝试使用 while 循环暂停它,但是因为 JS 是单线程的,所以这会卡住程序。我被告知我可以使用 Promises 解决这个问题,但代码在暂停时仍然卡住,我无法恢复程序。
我怎样才能正确地使这项工作异步进行?
var pause = false;
var q = 'query';
fetchUrls(q);
function fetchUrls(q, page = 0) {
PAUSE().then(function () {
request(`https://www.google.com/search?q=${q}&start=${page}`, (error, response, htmlString) => {
if (!error && response.statusCode == 200) {
// Do whatever I want with the page data
page += 10;
fetchUrls(q, page);
}
});
});
}
function PAUSE() {
return new Promise(resolve => {
if (pause) {
$('.pause-button').addClass('hidden');
$('.resume-button').removeClass('hidden');
}
// Pause the program
while (pause) {
}
$('.pause-button').removeClass('hidden');
$('.resume-button').addClass('hidden');
resolve(true);
});
}
$(document).on('click', '.pause-button', function() {
pause = true;
});
$(document).on('click', '.resume-button', function() {
pause = false;
});
最佳答案
处理状态很困难,为此我建议您使用像 react 这样的现代框架。这也将帮助您构建代码。
学习promises,我想你已经把then的 Angular 色和promise任务调换了。
// this should be maybe on the promise creator
request(`https://www.google.com/search?q=${q}&start=${page}`, (error, response, htmlString) => {
if (!error && response.statusCode == 200) {
// Do whatever I want with the page data
page += 10;
// fake the request to test it in isolation
fetchUrls(q, page);
}
});
// this should be when resolving, on the method .then
return new Promise(resolve => {
if (pause) {
$('.pause-button').addClass('hidden');
$('.resume-button').removeClass('hidden');
}
// Pause the program
while (pause) {
}
$('.pause-button').removeClass('hidden');
$('.resume-button').addClass('hidden');
resolve(true);
});
本主题: promise 、回调、状态更改并不容易...
我已经为您的代码创建了一个工作版本,其中包含模拟请求的功能,这意味着进行虚假请求。正如我所说,我希望这能帮助您澄清一些概念。即使您想将此代码转换回原始 javascript。
const fakeRequest = (url,callback) => {
const time = 300 + Math.random()*1800;
console.log("Fetching "+url+" ...");
setTimeout(() => {
console.log("Elapsed "+Math.round(time)+"ms");
let error,response = {};
if (Math.random() > 0.1){
error = false;
response.statusCode = 200;
}else{
error = true;
}
callback(error,response,'<HTML/>');
},time);
};
class UrlFetcher extends React.Component {
constructor() {
super();
this.state = {paused:true, page:0};
//this.handleOnChange = this.handleOnChange.bind(this);
}
onClick() {
return () => {
if (this.state.paused)
this.fetchUrls('query');
this.setState((state, props) => {
state.paused = !state.paused;
return state;
});
}
}
fetchUrls(q) {
console.log('Promising');
return new Promise((resolve,reject) => {
fakeRequest(`https://www.google.com/search?q=${q}&start=${this.state.page}`, (error, response, htmlString) => {
if (!error && response.statusCode == 200) {
// Do whatever I want with the page data
console.log("Request HIT");
resolve(true);
}else{
console.log("Request FAILED");
resolve(false);
}
});
}).then(()=>{
if (!this.state.paused){
this.setState((state, props) => {
state.page += 10
return state;
});
this.fetchUrls(q);
}
});
}
render() {
const btnStates = {
true : {text: 'Launch', class: 'launch-button'},
false : {text: 'Pause', class: 'pause-button'}
};
const btn = btnStates[this.state.paused];
return (
<button class={btn.class} onClick={this.onClick()}>
{btn.text}
</button>
)
}
}
ReactDOM.render(<UrlFetcher />, document.getElementById('urlfetcher'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="urlfetcher"></div>
关于javascript - JS : Using Asynchronous Functions to Pause Operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52912333/
来自 Akka 文档,Pipelining and Parallelism Akka Streams processing stages (be it simple operators on Flow
我正在开发一个提取元数据的 chrome 扩展程序。解析元数据的代码包含在内容脚本中。 background.js 和 content.js 通过 sendMessage 请求和响应进行通信。我遇到了
我正在使用 Python 3.7.4 和这段代码(MWE): import asyncio async def foo(x): await asyncio.sleep(1) retur
嘿,我对 Dart Futures 很陌生,我有以下情况。 每当用户在 UI 中键入一个字母时,addressChanged()我的 ui_component 中的方法被调用。该方法调用方法getPr
我在尝试将异步函数转换为同步函数时遇到问题。 这是类中的一个方法: doPost: function(call, data) { var uri = 'http://localhost/api
在很多关于 C# 的 async/await 的讨论中,我看到人们提到了“自然异步”或“纯异步”的术语。这些术语到底是什么意思? “自然异步”操作的一些示例是什么?为什么这样调用它? “非自然异步”操
现在我正在使用 Gevent,我想问两个问题: 有没有办法执行特定的任务,这将 从不异步执行 (而不是在每个任务中使用锁) 有没有办法到优先在 Gevent 中生成任务?就像一组将以低优先级生成的任务
在 document , 如果方法也用@gen.coroutine 修饰,则不需要@web.asynchronous。像这样 @web.asynchronous @gen.coroutine def
已在 Google Analytics(分析)帮助论坛中发布此内容,但无人能提供帮助。希望我在这里有更多的运气......: 我对我的网页使用 Google Anlaytics 异步跟踪。像个魔法一样
我正在尝试从 Controller 异步发送电子邮件并收到以下错误: 我不想等待电子邮件发送完成操作。 An asynchronous module or handler completed whil
在使用 SendMailAsync 时出现以下错误: An asynchronous module or handler completed while an asynchronous operati
我有一个非常简单的 ASP.NET MVC 4 Controller : public class HomeController : Controller { private const st
我正在编写一个使用 ASP.NET Web API 代理一些 HTTP 请求的应用程序,我正在努力识别间歇性错误的来源。这似乎是一个竞争条件...但我不完全确定。 在详细介绍之前,先介绍应用程序的一般
Cancel CancellationTokenSource 的成员对象“传达取消请求”,我认为这意味着它是触发并忘记并且不会等到取消完成(例如,所有异常处理程序都已运行)。这很好,但我需要等到一个未
在 D 中异步调用其他进程的首选方法是什么?我的用例正在调用 svn status检查退出状态,并解析其标准输出和错误。 最佳答案 我想 std.stdio.popen是你想要的: void pope
我一直听说使用异步编程模式会使我的代码运行得更快。为什么这是真的?无论是现在运行还是稍后运行,都不是必须以任何一种方式运行完全相同的代码吗? 最佳答案 它不是更快,它只是不浪费时间。 同步代码在等待
我有点困惑为什么同步调用与异步调用不同,因为从来没有“立即”响应,它仍然需要几纳秒或几毫秒? 最佳答案 同步调用在完成其工作(或达到超时)后返回其调用者。异步调用在启动其他事件后立即返回。 这意味着,
我正在尝试使用 MSDN 上描述的 OVERLAPPED 结构异步调用 DeviceIO 函数。 我正在使用 FSCTL_ENUM_USN_DATA 控制代码来枚举 NTFS 驱动器的 MFT,但我无
我一直在尝试创建一个服务器进程,以异步方式从客户端进程接收输入文件路径和输出路径。服务器进行了一些与数据库有关的转换,但是为了简单起见,我们假设它只是将所有内容都转换为大写。这是服务器的一个玩具示例:
我正在编写一个异步方法,它应该异步查询一个端口,直到找到一个,或者在 5 分钟后超时; member this.GetPort(): Async = this._GetPort(DateTim
我是一名优秀的程序员,十分优秀!