我有一个递归的异步函数,它使用 REST api 和完成处理程序向 Google Drive 查询文件 ID:
func queryForFileId(query: GTLRDriveQuery_FilesList,
handler: @escaping FileIdCompletionHandler) {
service.executeQuery(query) { ticket, data, error in
if let error = error {
handler(nil, error)
} else {
let list = data as! GTLRDrive_FileList
if let pageToken = list.nextPageToken {
query.pageToken = pageToken
self.queryForFileId(query: query, handler: handler)
} else if let id = list.files?.first?.identifier {
handler(id, nil)
} else {
handler(nil, nil) // no file found
}
}
}
}
在这里,query
设置为返回nextPageToken
andfiles(id)
字段,service
是 的一个实例GTLRDriveService
,并且FileIdCompletionHandler
只是一个typealias
:
typealias FileIdCompletionHandler = (String?, Error?) -> Void
我已经阅读了如何将异步函数转换为承诺(如在这个线程中),但我不知道如何将其应用于递归的异步函数。我想我可以将整个方法包装为Promise
:
private func fileIdPromise(query: GTLRDriveQuery_FilesList) -> Promise<String?> {
return Promise { fulfill, reject in
queryForFileId(query: query) { id, error in
if let error = error {
reject(error)
} else {
fulfill(id)
}
}
}
}
但是,我希望更直接一些:
private func queryForFileId2(query: GTLRDriveQuery_FilesList) -> Promise<String?> {
return Promise { fulfill, reject in
service.executeQuery(query) { ticket, data, error in
if let error = error {
reject(error)
} else {
let list = data as! GTLRDrive_FileList
if let pageToken = list.nextPageToken {
query.pageToken = pageToken
// WHAT DO I DO HERE?
} else if let id = list.files?.first?.identifier {
fulfill(id)
} else {
fulfill(nil) // no file found
}
}
}
}
}
那么:当我需要进行另一个异步调用时,我会怎么做executeQuery
?