0

私はreactJSを初めて使用し、ソートビジュアライザーを構築しようとしています。私が直面している問題は、quickSort() ルーチンの実装中です。
私の quickSort() ルーチンは次のとおりです。

async quickSort(array, p, r) {
         if(p<r){
                this.Partition(array,p,r).then((q)=>{
                console.log(p, ' ', r)
                this.quickSort(array, p, q-1)
                this.quickSort(array,q+1,r)

                })  
            }   
    }

Partition 関数で .then を使用する理由は、アニメーションの Partition ルーチンで async/await を使用しているためです。次に、Partition ルーチンがパーティション 'q' の値を返し、再帰が発生する可能性があります。Partition 関数は、その値がパーティション値 'q' であるプロミスを返します。この値がないと再帰は続行できず、したがって '.then' 部分になります。

現在、コードは正しく実行されていますが、もう少し機能を追加したいと考えています。この quickSort() ルーチンは、quickSortHelper() ルーチンの内部から呼び出しています。quickSortHelper() では、最初にボタンを無効にしてから、quickSort() を呼び出し、quickSort() の完了後にボタンを再度有効にします。しかし、問題は、最初の呼び出しの後に quickSort(array, 0 , n-1) が返されるため、ボタンが即座に無効になり、再帰全体が展開されるのを待たずに有効になることです。

約束が解決されたときにのみボタンを有効にするように、quickSort() 内から約束を返そうとしました。しかし、promise は 1 ~ 2 回の反復後に解決されます (これは p>r の瞬間に関数が戻ると思われるため理にかなっています) ため、再帰全体が終了するのを待たずにボタンが有効になります。

これを修正する方法について何か提案はありますか? quickSort() が完了するまで実行を一時停止し、ボタンを有効にする作業を続行する方法はありますか?

async quickSortHelper(){
        this.setState({generateButton: true})
        console.log(this.state.generateButton)

        var array = this.state.array

        this.quickSort(array, 0, array.length-1 ).then(()=>{
            this.setState({array})
            this.setState({generateButton: false})
        })
    }

また、もう 1 つ、console.log(this.state.generateButton) が false を出力します。それで、状態を真に設定することは決してありませんか?なぜこれが起こっているのか理解できませんか?

4

2 に答える 2