0

コールバックがあり、複数回(setTimeOutを介して再帰的に)コールバックしています...戻り値をキャプチャする条件は1つだけです。つまり、コールバックが自分自身をコールバックし終えたときです。

しかし、この状態で何かを返すと、期待したところに届かず、どこに行くのか全くわかりません。以下のスニペットには、これらのポイントを示す2つの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 に答える