- 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/
我正在编写一个小脚本来练习使用 boost 库。 使用these header /命名空间,这是我的主要功能: int main() { ifstream inNew("../../Downloads
我正在用 SpriteKit 创建我的第一款游戏。我正在尝试暂停我的 GameScene,然后通过 SpriteKit 运行一些动画。问题是,如果我使用 self.view?.isPaused = t
我在尝试暂停倒计时器时遇到问题。我试图做到这一点,以便在单击播放按钮后,该按钮变为暂停按钮。但由于某种原因它不会暂停。 我尝试将 id“pButton”更改为“pauseButton”,这是有效的,但
在滚动更新之前,我想在我们的监控工具中为每台主机设置停机时间。我为此创建了一个自定义模块。设置停机时间时可能会出现问题,我们无法解决。在那种情况下,我想让用户选择是否应中止部署或继续部署而不设置停机时
根据 this paragraph ,以下有问题: /* usr_interrupt is set by the signal handler. */ if (!usr_interrupt)
我有一个 TThread 对象,希望能够通过程序主窗体上的按钮启动/停止线程。我一直在寻找实现这一目标的方法,到目前为止我有以下想法: 当用户单击“停止”时终止并释放线程,并在单击“开始”时创建一个新
这里我有一个方法 public static Color pickColor(){ final aero.colorpicker.Frame frame = new aero.colorpic
我在这个循环中犯了一些错误,我真的无法弄清楚。这是循环: while (true) { System.out.print(stepName[currentTick]);
我刚刚发现 Barba.js 并发现它非常有用。它提供同一网站的 URL 之间的平滑转换。 我整理了一个 Plunker 由两个页面(index.html 和 about.html)组成,借助 jQu
我写了一个程序来尝试用 C 语言编写线程,但这很奇怪 它不会陷入 while 状态(例如 while (1){}) 我尝试用 getchar、scanf 和 while(1) 暂停我的程序,但它没有停
music.pause(); 似乎在我的代码中不起作用。当我单击播放按钮(该按钮是使用 html 5 Canvas 中的框制作的)时,它可以播放音乐,但是当我单击停止按钮时,它不起作用。请帮助我。 这
我一直在用 python 3.3 编写一个基本的计算器,我希望能够在命令窗口中运行它。 但是我一读完它就关闭了窗口,我还没来得及查看最终答案。 所以我想知道是否有等效于 c++ System('PAU
考虑以下代码: 进程 A(在随机时间点): void catch(){}; // empty handler. signal(SIGCHLD,&catch); // attach empty hand
我在 x.m 中使用了函数“pause”(不带参数),但它无法挂起程序。当程序执行此功能时,它只是继续运行。 最佳答案 kbhit对我不起作用。使用 input函数帮助我解决了问题。 关于Octave
我一直在寻找一些自动的方式来编号与 biblatex 的投影机马德里同一张幻灯片上的引用文献。这适用于 \pause和 \footcite{} .但是当我在同一张幻灯片上有多个项目符号(例如 5),并
好的,所以我上周在iOS8推出之前启动了一个应用程序。在iOS7及更低版本中,一切正常。但是现在,由于人们已经更新到iOS8,我的应用程序无故暂停/崩溃。 当我将NSMutableArray设置为NS
试图在我的应用程序中放置一个“暂停”按钮,以播放一些声音片段循环播放。 当我打电话mp.pause();一切都破了,我完全迷路了! 这是我正在使用的方法。 protected void man
我已经尝试过简单的controls =“pause”代码,但是我不想显示可见的音乐播放器。我希望第二次单击“播放按钮”时出现暂停功能。 有没有办法在此代码中插入“点击暂停”功能?我不想看到一个单独的按
所以我有这样的功能: function music(song) { var audio = new Audio("audio/" + song + ".ogg"); audio.play(); } 我
当我在 Chrome 中打开异常时暂停时,它会在弹出 JavaScript 错误时正确暂停,但我看不到异常消息本身。 有什么办法可以在点击“继续”之前看到该消息吗? 注意有时可以尝试从源代码中读取它,
我是一名优秀的程序员,十分优秀!