如何让另一个异步调用等待?

mrjimoy_05

如果其中一个调用在继续其他调用之前需要先完成的条件,如何暂停另一个异步调用?从下面的代码(简化)来看,当makeRequest得到401时,它应该调用refreshSession并暂停其他调用,直到这个调用完成。

let refreshSessionDispatchQueue = DispatchQueue(label: "refreshSession")
var refreshSessionJobQueue: [APIRequest] = []

// This function will be called by each of APIs that got 401 error code
private func refreshSession(errorCode: String? = nil, request: APIRequest) {
    refreshSessionDispatchQueue.async {
        self.refreshSessionJobQueue.append(request)
    }

    // The idea is, after all job appended to the jobQueue, let says after 1', it will call another function to execute another job
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
        self.executeRefreshSessionJobQueue()
    }
}

// This is to execute refreshSession, and if it's succeed, all job on the jobQueue will be re-executed
private func executeRefreshSessionJobQueue() {
    DispatchQueue.main.async {
        let readyToRefreshSessionJobQueue = self.refreshSessionJobQueue
        
        if self.refreshSessionJobQueue.count > 0 {
            self.refreshSessionJobQueue = []

            self.refreshSession { [weak self] succeed in
                if succeed {
                    for job in readyToRefreshSessionJobQueue {
                        self?.makeRequest(baseURL: job.baseURL, endpoint: job.endpoint, method: job.method, encoding: job.encoding, headers: job.headers, params: job.params, customBody: job.customBody, completion: job.completion)
                    }
                    self?.refreshSessionJobQueue = []
                } else {
                    // And if it's failed, all the job should be removed and redirect the page to the login page
                    self?.refreshSessionJobQueue = []
                    ErrorHandler.relogin()
                }
            }
            
        }
    }
}
安东尼乌斯

如果在获取 401 时需要重试 API,可以尝试使用 Alamofire 的 RequestInterceptor 中的 RequestRetrier。在您的情况下,它基本上会重试遇到错误(例如 401)的请求。

完整的实现示例可以在这里找到希望能帮到你,加油!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从另一个lambda异步调用aws lambda

如何对等待另一个异步任务的AsyncTask进行单元测试?

等待最后一个异步调用和只返回它之间有区别吗?

等待另一个异步功能完成

如果我执行一个进行异步调用的函数,那么在执行循环时如何使其余函数在执行之前等待调用?

使用RxJS如何缓冲函数调用,直到解决了另一个异步函数调用

异步任务等待另一个任务

如何在依赖另一个异步调用数据的forEach()内部进行异步调用?

如何使用异步将数据从一个组件获取到另一个组件并等待

异步端点的调用被另一个线程阻塞

如何在Angular中的另一个方法之后同步调用方法?

异步/等待模式。如何将等待方法传递给另一个方法

包括另一个异步等待承诺的承诺-如何解决?

我应该如何使用在一个异步调用中返回的accessToken在另一个异步调用中?

Angular等待多个异步发布请求,然后调用另一个端点

如何在Webflux中的另一个异步方法内进行异步调用?

异步方法中的最后一个异步调用需要等待吗?

等待另一个异步资源的角度方式?

尝试将数据从异步调用转移到另一个类

异步等待另一个请求而不会阻塞

异步函数在另一个函数中调用时不等待 Promise

如何使用 javascript 承诺使一个函数等待另一个函数异步完成运行?

如何在继续另一个动作调用之前让动作调用等待

退出项目并进入另一个项目时,是否异步调用 OnMouseEnter 和 OnMouseLeave?

在另一个 .JS 文件的类中异步调用 SQL Server

如何让一个单独的同步函数等待另一个异步函数?

如何将回调函数返回的值赋给变量?无法从另一个问题中理解。关于异步调用

如何在另一个异步函数中调用异步函数

在另一个函数中异步调用后,我一直未定义