Как использовать L oop в PromiseKit 6? - PullRequest
3 голосов
/ 13 июля 2020

У меня есть функция с именем chaining, которая связывает несколько promises, и я хочу вызывать эту функцию несколько раз. Для этого я использую for l oop и хочу, чтобы с индексом 0 функция chaining выполнялась с индексом 0. (У меня есть массив свойств ListingArray[], и я хочу используйте ListingArray [0] в одной итерации l oop, ListingArray [1] в другой итерации и т.д.).

Вот моя функция chaining:

func chaining() {
  
 firstly {
            Promise_getIDOfOwnerFromCollection()
        
 }.then { (IdsInCollection)-> Promise<[String]> in
        
        return self.Promise_getOwnerListings(IDs: IdsInCollection)
            
 }.then { (ownerListings) ->Promise<Void> in

            return self.Promise_getReviews(ListingIDs: ownerListings)
           
 }.done { (arg0) in
            
            
            let () = arg0
            print("Work Done")
            
 }.catch { (error) in
            print("Error is \(error.localizedDescription)")
    }
 }

И Я вызываю эту функцию в l oop вот так.

for Count in 0...4 {
  chaining()
 }

Теперь проблема в том, что функция внутри firstly мгновенно вызывается 5 раз перед выполнением then. И я хочу, чтобы последовательность была как с Count 0, chaining функция должна выполняться один раз, а затем с Count 1 функция должна выполняться снова.

1 Ответ

1 голос
/ 16 июля 2020

Поведение, происходящее в вашем коде, вполне ожидаемо. Учитывая, что вы создаете цепочку 4 раза, поэтому первое задание будет выполнено такое количество раз.

Вместо этого вам нужно будет каким-то образом предоставить единственный экземпляр работы для первого. : выполнить N раз {сначала + остальная часть задания}

Ожидается: сначала + выполнить N раз {остальная часть задания}

Вот пример кода, основанный на вашем.

struct Review {

}

func Promise_getReviews(listingIDs ids: [String]) -> Promise<[Review]> {

}

func Promise_getOwnerListings(IDs ids: [String]) -> Promise<[String]> {

}

func chaining(from initialWork: Promise<[String]>) {
    firstly { when(fulfilled: initialWork) }
        .then(Promise_getOwnerListings)
        .then(Promise_getReviews)
        .done { print("Work Done") }
        .catch { print("Error") }
}

let initialWork = Promise<[String]>(["1","2", "3"])

(0...3).forEach { chaining(from: initialWork) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...