【发布时间】:2017-06-27 19:03:34
【问题描述】:
我有一个递归异步函数,它使用 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 和files(id) 字段,service 是GTLRDriveService 的一个实例,而FileIdCompletionHandler 只是一个typealias:
typealias FileIdCompletionHandler = (String?, Error?) -> Void
我已经阅读了如何将异步函数转换为 Promise(如 this thread),但我不知道如何将其应用于递归的异步函数。我想我可以将整个方法包装为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 进行另一个异步调用时,我该怎么办?
【问题讨论】:
-
在找不到文件时使用
reject意味着我将不得不使用错误处理代码来处理找不到文件的完全正常情况。这似乎更像是一种扭曲,而不是在找到文件的情况下测试承诺是否兑现。我宁愿留下错误处理代码来处理网络故障、权限问题等问题。
标签: swift asynchronous recursion google-drive-api promisekit