So beenden Sie die loop in einen asynchronen Aufruf?

Vereinfachte version meines Codes sieht so aus:

var joined = false

for room in rooms {
    checkRoom() { // async func
        if room.player.count == 1 { 
            join(room)
            joined = true
            // break doesnt work here
        }
    }

    if joined {
        break;
    }
}

Ich brauche, um zu beenden diese Schleife, weil es immer noch die Kontrolle anderer Zimmer nach dem Beitritt zu einer. Ich will aufhören überprüfung rest der Zimmer, wenn er kam wahr wird. Aber natürlich ist es wahr wird im asynchronen Aufruf nur so meine Methode nicht funktioniert.

Wie kann ich das beenden dieser Schleife, wenn er kam wahr wird?

  • Ausgewählte Antwort
    Maverick
    4. Mai 2019

    async-Funktion aufrufen, sollten vermieden werden, im inneren Schleife. Angenommen, checkRoom() Methode-API-Aufruf intern. In diesem Fall Schleife wird ausgeführt für alle Zimmer-und API-Anfragen für alle Räume in die Warteschlange gestellt werden, unabhängig davon, Wann Sie bekommen Antwort für jede Anforderung.

    Idealerweise sollten Sie ersetzen Schleife mit Rekursion. Aufruf checkRoom() innerhalb der Funktion, nennen wir es mal mainFunction(), und auf die Reaktion warten. Wenn dein Kriterium für den Beitritt Raum nicht erfüllen, dann rufen Sie Ihren mainFunction() rekursiv machen, die nächsten Aufruf von checkRoom() - Funktion. So etwas wie dieses:

    var rooms: Array<Room> = []
    var currentRoomIndex: Int = 0
    
    func mainFunction() {
    
            checkRoom() { // async func
                let room = rooms[currentRoomIndex]
                if room.player.count == 1 {
                    join(room)
                    joined = true
                    break
                } else {
                    currentRoomIndex += 1
                    mainFunction()
                }
            }
    }
    

    Ein anderer Weg wäre die Warteschlange alle Ihre Wünsche zu checkRoom() function und sobald Ihr Zimmer Eintritt Kriterium erfüllt, beenden von Aufgaben, die nicht ausgeführt werden, in der Warteschlange.