另一个闭包内的闭包

Posted

技术标签:

【中文标题】另一个闭包内的闭包【英文标题】:Closure inside another closure 【发布时间】:2020-09-11 02:26:26 【问题描述】:

在下面的实现中,我在另一个闭包中有闭包,并希望返回第二个闭包响应。 func customerAccount() -> Result 我卡住了。

public func customerAccount()
  self.loadCurrentAccount  (account) in
   self.fetchData  (result) in
      // wonder how to return result from the parent method
      print(result)
  


func fetchData(completion: @escaping(Result?) -> Void)  
  guard let context = self.context else  return 
    
  let parameters = Parameters(scopes: scopes)
  context.fetchData(with: parameters)  (response, error) in
    if let error = error 
      completion(nil)
    
    guard let response = response else 
      return
    
    completion(response)
   

【问题讨论】:

这能回答你的问题吗? Swift wait for closure thread to finish 如果fetchData使用了一个异步函数context.fetchData,那么它就不能同步返回一个尚未获得的值。 可能重复:Returning data from async call in Swift function 问题已修改。 【参考方案1】:

在这些情况下,最好使用完成块。完成块将返回异步值...

@IBAction func dataButtonClicked(_ sender: Any) 
 fetchData  (res) in
     self.result = res
 


func fetchData(completion: @escaping (Result?) -> Void)  
  guard let context = self.context else  
    completion(nil) 
    return
  
    
  let parameters = Parameters(scopes: scopes)
  context.fetchData(with: parameters)  (response, error) in
    if let error = error 
      completion(nil)
      return
    
    guard let response = response else 
      completion(nil)
      return
    
    completion(response)
   

【讨论】:

问题稍作修改。 抱歉,我不确定新问题在问什么……您要返回什么? 为什么不返回结果而不是打印呢?或者你可以为 customerAccount(completion: @escaping (Result?) -> Void) 做另一个完成块

以上是关于另一个闭包内的闭包的主要内容,如果未能解决你的问题,请参考以下文章

关于闭包

JavaScript 闭包 立即执行函数

我所理解的JavaScript闭包

面试必问之闭包

JS闭包总结

《你不知道的JS(上卷)》作用域闭包