在Kotlin中把异步方法的结果保存在变量中

3 人关注

我试图将一个异步Kotlin方法的结果存储到一个变量中。

        Amplify.Auth.fetchAuthSession(
            {result ->
                Log.i(TAG, "Amplify: Fetch Auth Session $result")
                isAuthenticated = result.isSignedIn
            {error ->
                Log.e(TAG , "Amplify: Fetch Auth Session $error")
        if (isAuthenticated == true) {
[...]

我真的不知道如何将result.isSignedIn设置为isAuthenticated变量,以便我可以在闭包之外使用它。我在stackoverflow上找到了一个类似的问题,但它并没有帮助我。

谁能帮帮我?

1 个评论
也许 this 是你要找的吗?
android
kotlin
asynchronous
Elmar B.
Elmar B.
发布于 2020-10-23
2 个回答
mrpasqal
mrpasqal
发布于 2020-10-23
已采纳
0 人赞同

你在这里所做的(就在lambda内保存值而言)在技术上是正确的,但在功能上--不一定:值在被lambda更新之前被使用。

考虑从回调lambda开始进一步的逻辑,在那里你收到 result

请看下面的片段,以便更好地了解情况。

        Amplify.Auth.fetchAuthSession(
            {result ->
                Log.i(TAG, "Amplify: Fetch Auth Session $result")
                handleResult(result.isSignedIn)
            {error ->
                Log.e(TAG , "Amplify: Fetch Auth Session $error")
    } // end of the method with the async call
    fun handleResult(isAuthenticated: Boolean) {
        // here goes the code that consumes the result
        if (isAuthenticated) {
            // ...
    
我不太确定我是否理解你的意思,但我应该在接收结果的lamda中从android调用onCreate()方法?
绝对不可以!你真的不应该自己调用任何活动生命周期的方法。我想把你在异步调用下面的逻辑(以 if (isAuthenticated == true) { 行开始)提取到一个单独的方法中,这个方法将接受你在lambda中收到的参数。请看编辑后的答案。
ForWiz
ForWiz
发布于 2020-10-23
0 人赞同

我不确定这是否是最好的做法,但在涉及到异步函数时,从代码的可读性和功能方面来说,这对我来说是可行的。
假设你有一个异步函数 doSomethingAsync 。如果我需要它在跟进其他指令(比如你的if语句)之前完成,我就把1个或多个函数传给异步函数,每个函数都涵盖了某种情况。
我这样说的意思如下。

    fun doSomethingAsync() (
        onSuccess : (fetchedObject : Any) -> Unit,   // Do stuff with returned value
        onFailure : (e : Exception) -> Unit,  // Catch an exception
        onComplete : () -> Unit  // Do stuff after the value has been fetched
        // Your async function body, which could return a Task
        .addOnSuccessListener { result ->
            onSuccess(result)
            onComplete()
        .addOnFailureListener { exception -> 
            onFailure(exception)

在你的例子中,你可以把你的if语句和后面的东西放到一个函数中,你可以把它作为一个函数参数传递给异步函数,在异步任务完成后调用。

        Amplify.Auth.fetchAuthSession(onComplete : () -> Unit)
        {result ->
            Log.i(TAG, "Amplify: Fetch Auth Session $result")
            isAuthenticated = result.isSignedIn
            onComplete()
        {error ->
            Log.e(TAG , "Amplify: Fetch Auth Session $error")