0

我有一个回调,我多次回调(通过 setTimeOut 递归)......只有一个条件我想捕获返回值,即回调完成时回调自身。

但是在这种情况下,当我退回某些东西时,我并没有得到我期望的东西,而且我根本不知道它去哪里了。有两个 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';
        }
    }
};
4

1 回答 1

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();
于 2012-08-03T19:45:04.167 回答