在lateinit var初始化时通知(Kotlin)

时间:2017-12-07 01:32:07

标签: kotlin kotlin-lateinit

这是一个直截了当的问题,但我找不到答案。有没有办法在Kotlin中初始化email: { type : DataTypes.STRING, validate : { isEmail: { msg: "wrong format email" }, notEmpty: { msg: 'Email not null' }, isUnique: function(value, next){ 'table'.find({ where : { email:value, id:{[Op.ne]: this.id} } }).then(function(result){ if(result === null){ return next() }else{ return next(' Email already use') } }).catch(err =>{ return next() }) } } } 时收到通知?

我知道我可以检查它是否已使用lateinit var初始化,但这不一样。

谢谢

2 个答案:

答案 0 :(得分:3)

lateinit var仅适用于最简单的情况,即未初始化的值在应用程序的上下文中没有意义,例如onCreate()中的依赖注入或后期初始化。

您需要的是具有特定行为的属性委托。看看http://selenium-python.readthedocs.io/api.html

var coolvar by Delegates.observable("initial value") { _, old, new ->
    println("coolvar has been updated")
}

答案 1 :(得分:-1)

如果您使用Kotlin协程,则可以使用delay()函数处理它。 对于复杂的场景。如果值更改,则不像直接函数那样调用此函数。

示例:

private var lateinit extractFilesThread: Deferred<Unit>

private fun init() {
  GlobalScope.async {loadData()}
  GlobalScope.async {doSomeWork()}
}

private suspend fun loadData() {
  extractFilesThread = GlobalScope.async { 
    initialFilesManager.extractDataIfNeeded() 
  }
}

private suspend fun doSomeWork() {
  GlobalScope.async {
    waitExtractFilesThread()
    startThisWork()
  }
}


private suspend fun waitExtractFilesThread() {
  while (!::extractFilesThread.isInitialized) {
    delay(HALF_SECOND_IN_MILI)
  }
  extractFilesThread.await()
}

所以在这里您要在extractFilesThread完成后调用startThisWork() 并且只有在await()已经初始化的情况下,您才能使用它,因此我们使用delay()函数,这是一个暂停函数,因此它不会阻止其他函数的执行。