我有一个回调函数,我多次回调(通过setTimeOut递归)...只有一个条件我想要捕获一个返回值,也就是回调完成后回调。< / p>
然而在这种情况下,当我退回某些东西时,我没有达到我想要的地方,而且我不知道它在哪里。在下面的代码段中有两个标记这些点的console.log语句。我发送的地方......以及我期待的地方。
if( MC.C.movePane( pane_element, 0, 0, 0, 'begin' ) ) {
cover_element.style.display = 'none';
console.log('I never got it');
}
return o_p;
},
movePane: function( pane_element, start, end, index, state ) {
if( ( state === 'begin' ) ) { // init the function
start = parseInt( window.getComputedStyle( pane_element, null ).getPropertyValue("top"), 10 );
end = start + 40;
index = start;
state = 'down';
MC.C.movePane( pane_element, start, end, index, 'down' );
}
if( ( state === 'down' ) && ( index < end ) ) { // move down
index += 1;
pane_element.style.top = ( index ) + 'px';
setTimeout( function( ){ MC.C.movePane( pane_element, start, end, index, state ); }, 1 );
}
else if( ( state === 'down' ) && index === end ) { // hold
state = 'up';
setTimeout( function( ){ MC.C.movePane( pane_element, start, end, index, state ); }, 2000 );
}
else if( ( state === 'up' ) && ( index > start ) ) { // move up
index -= 1;
pane_element.style.top = ( index ) + 'px';
setTimeout( function( ){ MC.C.movePane( pane_element, start, end, index, state ); }, 1 );
}
else if( ( state === 'up' ) && ( index === start ) ) { // all done, return
console.log('I just returned true');
return true;
// document.getElementById( 'po_but_cov' ).style.display='none';
}
}
};
答案 0 :(得分:1)
如果您询问如何从movePane()
调用setTimeout()
时恢复setTimeout()
的返回值,则不能。 setTimeout()
没有规定捕获和返回值。但是没关系,因为在回调执行时,调用 MC.C.movePane( pane_element, 0, 0, 0, 'begin', function() {
cover_element.style.display = 'none';
});
return o_p;
// ...
movePane: function( pane_element, start, end, index, state, myCallback ) {
// ...
else if( ( state === 'up' ) && ( index === start ) ) { // all done, return
console.log('I just returned true');
// return true;
myCallback();
的代码不再运行 - 是吗?
如果你想让回调通知它已经完成了某些事情 - 那就抓住你的帽子 - 你将不得不给你的回调一个回调它自己的回调。当回调虽然做了时间延迟的事情时,它可以调用该回调,如果它获得了返回值,它将执行原始代码所做的任何事情。
很抱歉,如果这会让你的头部受伤,但这就是它的运作方式。
它可能看起来像(对不起,如果parens和大括号不匹配)
{{1}}