如何在 PromiseKit 6 中使用循环?

Posted

技术标签:

【中文标题】如何在 PromiseKit 6 中使用循环?【英文标题】:How to use Loop in PromiseKit 6? 【发布时间】:2020-07-13 08:02:45 【问题描述】:

我有一个名为chaining 的函数,它链接了多个promises,我想多次调用该函数。为此,我使用了for 循环,我希望使用索引0chaining 函数应该使用索引0 执行。(我有一个属性数组ListingArray[],我想使用ListingArray[ 0] 在循环的一次迭代中,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)")
    
 

我正在像这样循环调用该函数。

for Count in 0...4 
  chaining()
 

现在的问题是firstly 内部的函数在then 执行之前被立即调用了5 次。我希望序列与Count 0 一样,chaining 函数应该执行一次,然后Count 1,函数应该再次执行。

【问题讨论】:

【参考方案1】:

您的代码中发生的行为完全符合预期。鉴于您将链接实例化 4 次,因此第一个作业将执行这样的次数。

相反,您首先需要以某种方式提供单个工作实例。

目前:执行 N 次 firstly + rest of the job

预期:首先 + 执行 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) 

【讨论】:

非常感谢您的回复!我是使用promiseKit 的新手,我很难理解你的答案。如果可能的话,请您添加更多详细信息来回答,以便我快速理解并快速奖励您 LOL :) 是的,没问题。基本上我发给你的例子应该完全符合你的意图。我所做的不同之处是为 first 块提供了一个 Promise。为了避免在调用链接时每次迭代都创建“新工作”。这就是为什么如您所见,我正在注入 Promise,以避免在第一次关闭时创建新工作。 关于其余部分,我只是使用 swift 的语法糖,它允许您执行 then(Promise_getOwnerListings) 并且我将比: ``` .then (IdsInCollection)- > Promise in return self.Promise_getOwnerListings(IDs: IdsInCollection) ``` 但它们的作用相同。 :) 说的很对。那么Review 结构呢?制作struct背后的逻辑是什么? 没什么特别的 :) 我确实通过阅读此方法签名 (Promise_getReviews) 假设您将收到基于提供的 ID 的评论。然后我确实创建了一个虚拟结构来表示示例。

以上是关于如何在 PromiseKit 6 中使用循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PromiseKit 6.3 返回 Promise<JSON>

PromiseKit 3.0:用循环链接

PromiseKit 6:如何创建多个并发 Promise 并将它们各自的结果分组到一个数组中?

PromiseKit 6 中 firstly 的合成器

PromiseKit `Result .. is used warning` 在带有 for 循环的链式序列中

使用 PromiseKit 6 在 Swift 4.2 中缓存