获取静态函数以返回异步值

Posted

技术标签:

【中文标题】获取静态函数以返回异步值【英文标题】:get static function to return async value 【发布时间】:2021-01-09 12:01:38 【问题描述】:

我想要一个静态 ES6 方法来简单地返回一个值而不是一个承诺。这就是我想要做的。

export default class Member 

  static existingMember() 
    var _existingMember;
    // DB.findExistingMember() -> returns a promise
    DB.findExistingMember().then(member => 
      _existingMember = member
    )
    return _existingMember
  


// in mocha test

describe('some test', function () => 
  const member = Member.existingMember()

  it('has access to member', function() => 
     // I want member to be available here instead of having to do member.then()
    console.log(member)
    foo.someFunction(member)
    bar.someFunction(member)
  )
)

【问题讨论】:

在您希望返回的变量_existingMember 的值设置为异步的情况下,您如何看待这可能? @Mitya 在设置点then 内,值没有解析吗? 是的——但是到那时你的静态方法已经完成了它的流程并返回了一个值为 undefined 的变量。直到稍后异步流程完成时才分配其值。 @Mitya 这正是我要解决的问题。有没有办法设置existingMember 以在没有async-await 的情况下从承诺内部返回值? 不 - 这是一个矛盾。除非您使用生成器之类的东西做一些花哨的事情,否则函数只会同步返回一个值。否则,承诺(其中async-await 是一个抽象)或至少某种形式的回调是您唯一的途径。 【参考方案1】:

您可以在 Member.existingMember 函数上使用 await 以将您的 member 用作普通变量

export default class Member 
    static existingMember() 
        return DB.findExistingMember();
    


// in mocha test

describe('some test', function ()  
    it('has access to member', async function () 
        const member = await Member.existingMember()
        console.log(member)
        foo.someFunction(member)
        bar.someFunction(member)
    )
)

【讨论】:

以上是关于获取静态函数以返回异步值的主要内容,如果未能解决你的问题,请参考以下文章

如何从静态函数返回函数接口?

简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

如何使用线程去执行一个 有返回值的方法,并获取返回值?

Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )

Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )