Ich bin irgendwo festgefahren, um dieselbe Funktion im Versprechen erneut aufzurufen, und weil ich mehrmals aufgerufen habe, ist es das Versprechen, die Zuweisung aufzuheben. Eigentlich habe ich in meinem Fall eine API mit mehrseitiger Anfrage und möchte sie mit Versprechen aufrufen. Ich habe es wie folgt implementiert.

func fetchContacts() -> Promise<FPGetContactResponse?> {
            
        return Promise { seal in

            let contactrequest = FPGetContactRequest()
            contactrequest.pageNo = getAPICurrentPageNo(Api.API_CONTACTS) + 1
            contactrequest.pageSize = SMALL_PAGE_SIZE
            
               contactrequest.doGetContacts(parameter: [:], response: { (response) in
                print("Contacts Count : \(response.Contacts?.count ?? 0)")

                if(response.Contacts?.count ?? 0 != 0){
                    _ = self.fetchContacts()

                }else{
                    seal.fulfill(response)
                }
               })
               { (error) in
                   print(error.localizedDescription)
                seal.reject(error)

            }
        }
    }

In der obigen Funktion überprüfe ich die Anzahl der Kontakte! = 0, dann muss ich dieselbe Funktion erneut aufrufen. Aber leider ist es ein Freigabeversprechen.

Ich nenne Versprechen Sequenz wie unten.

func startSyncData(handler:@escaping SyncAPIHandler){
        firstly {
            self.fetchContacts().ensure {
                handler(false,0.5,nil)
            }
        }.then { data in
            self.fetchInteractions().ensure {
                handler(false,0.7,nil)
            }
        }.then { data in
            self.fetchAddresses().ensure {
                handler(false,0.8,nil)
            }
        }.then { data in
            self.fetchLookupQuery().ensure {
            }

        }
        .done { contacts -> Void in
            //Do something with the JSON info
            print("Contacts Done")
            handler(true,0.8,nil)
        }
        .catch(policy: .allErrors) { error in
            print(error.localizedDescription)

        }

    }

Bitte geben Sie mir den richtigen Weg, um dieselbe Funktion im Versprechen erneut aufzurufen.

0
Dipen Chudasama 2 Sept. 2020 im 08:41

2 Antworten

Beste Antwort

Ich habe Dinge mit folgender Lösung implementiert.

func syncContacts() -> Promise<FPGetContactResponse?> {
      return fetchContacts().then{ seal -> Promise<FPGetContactResponse?> in
        if(seal?.Contacts?.count ?? 0 != 0){
            return self.syncContacts()
        }else{
            return Promise.value(seal)
        }
      }
    }

Rufen Sie jetzt einfach die Methode syncContacts() in der versprochenen Reihenfolge auf, wie unten.

 func startSyncData(handler:@escaping SyncAPIHandler){
        firstly {
            self.syncContacts().ensure {
                handler(false,0.5,nil)
            }
        }.then { data in
            self.syncInterections().ensure {
                handler(false,0.7,nil)
            }
        }.then { data in
            self.syncAddresses().ensure {
                handler(false,0.8,nil)
            }
        }.then { data in
            self.syncLookupQuery().ensure {
            }

        }
        .done { contacts -> Void in
            //Do something with the JSON info
            print("Contacts Done")
            handler(true,0.8,nil)
        }
        .catch(policy: .allErrors) { error in
            print(error.localizedDescription)

        }

    }
0
Dipen Chudasama 2 Sept. 2020 im 09:28

Anstatt Rekursion zu verwenden, sollten Sie eine Antwort innerhalb Ihres Versprechens zurückgeben und sie im nächsten .then überprüfen und fetchContacts erneut aufrufen, wenn dies erforderlich ist:

fetchContacts()
.then { response -> Promise<FPGetContactResponse> in
    if (response.Contacts?.count ?? 0 != 0) {
        return fetchContacts() // Make the second call
    }
    return .value(response) // Return fullfilled promise
}
.then {
    ...
}

Mit dem nächsten Ansatz können Sie auch einen speziellen Wrapper für Ihren Fall erstellen - https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#retry--polling

1
iUrii 2 Sept. 2020 im 09:00