由于某些原因,我最难绕过javascript回调,这让我很头疼。我有三个函数,我试图用来解析网站上的一些数据 -
function parseText() {
//this finds a bunch of DOM elements, grabs the innerHTML from each and stores
//it in an array
}
function scrollToTop() {
//this scrolls to the top of the window where I'm getting text from,
//which causes the window to load more DOM elements to parse
}
function removeOldElements() {
//this removes the already-parsed DOM elements from the DOM
}
而且我一直这样称呼它......我现在意识到这是一种完全可怕的做法,因为只要我切换标签,Chrome就会完全混乱setTimeout
和setInterval
时间导致很多错误。
function doEverything() {
parseText();
setTimeout(scrollToTop, 2000);
setTimeout(removeOldElements, 4000);
}
setInterval(doEverything, 5000);
//this loops it every 5 seconds so I can just run it in a separate tab
//while I continue to work on other things
这有点......但setInterval
中的任何暂停或中断都会破坏代码,而我知道我应该使用回调来进行此类调用第一个是完成执行,但我似乎无法让它工作。
我一直在阅读有关回调的内容,并且不太明白这种格式应该是什么..我尝试过这样的事情:
function parseText(callback) {
}
function scrollToTop(callback) {
}
function removeOldElements() {
}
function doEverything() {
parseText(
scrollToTop(
removeOldElements
)
)
}
setInterval(doEverything, 5000);
但这似乎只是调用scrollToTop
然后parseText
两次..并且根本不调用第三个函数! 哎呀!现在我真的很困惑......
有人可以帮忙吗?我确定我在做一些非常基本的错误。
答案 0 :(得分:0)
您正在谈论回调,但我没有看到任何与您的代码明确异步的内容。你需要在这里区分两件事:
// some code
func()
// some more code
`
// some code
async_func(callback_func)
// some more code
无法保证async_func中的所有代码都会在some more code
之前执行。事实上,它很可能会在以后执行。
从您的功能名称来看,它们看起来没有任何实际的异步工作。所以你可以这样称呼它们:
function doEverything() {
parseText()
scrollToTop()
removeOldElements()
}
此外,您忘记了上次函数调用removeoldElements()
的括号,这就是为什么它没有执行。
答案 1 :(得分:0)
回调是不错的选择,此示例可能会为您提供更多指导。
function one(fn) {
console.debug('one...');
setTimeout(fn, 1000);
}
function two(fn) {
console.debug('two...');
setTimeout(fn, 1000);
}
function three(fn) {
console.debug('three...');
setTimeout(fn, 1000);
}
function loop() {
console.debug('loop...');
setTimeout(function() {
one(function() {
two(function() {
three(loop);
});
});
}, 1000);
}
setTimeout(loop, 1000);
Open browser console, for logs.
答案 2 :(得分:-3)
我不确定你要做什么,但我建议你这样做:
function parseText(callback) {
//some code here
console.log("parsetext");
scrollToTop('callback');
}
function scrollToTop(callback) {
//some code here
console.log("scrollToTop");
removeOldElements();
}
function removeOldElements() {
//some code here
console.log("removeOldElements");
setTimeout(parseText, 5000);
}
ingparseText();