Как получить текущий `coroutineContext` из не приостановленной функции? - PullRequest
0 голосов
/ 13 февраля 2019

Скажем, у меня есть функция регистрации:

fun log(message: String)

К сожалению, эта функция будет вызываться как из сопрограмм, так и из-за сопрограмм.В случае сопрограмм, я хотел бы записать дополнительную информацию, поступающую из контекста сопрограмм (например, имя сопрограммы).

Как мне этого добиться?

Это мои мысли, но я не 'У него нет решения:

  • Каким-то образом выясните, внутри log, если оно находится внутри сопрограммы, и получите coroutineContext.Возможно ли это?
  • У меня может быть две версии log например log и logSuspend.Но как я могу гарантировать, что нужного человека вызовут?Если я нахожусь внутри suspend, ничто не мешает мне позвонить log случайно.Кроме того, у меня может быть обычная вспомогательная функция.Какой из них следует назвать?
  • Может быть, что-то с ThreadLocal, например, я мог бы coroutineContext внутри ThreadLocal в какой-то момент, но как я могу убедиться, что он обновляется?

1 Ответ

0 голосов
/ 13 февраля 2019

Каким-то образом выясните в журнале, находится ли он внутри сопрограммы, и получите coroutineContext.Возможно ли это?

Я не думаю, что есть хорошее решение для этого.

Я бы создал две log функции, сначала для общего назначения, затем - для расширенияфункция на CoroutineScope для сопрограмм:

fun log(message: String) {...}

fun CoroutineScope.log(message: String) {
    //here you can access coroutineContext
}

И если вы вызываете функцию log из сопрограммы, например:

GlobalScope.launch {
    log("CoroutineScope.log")
}

, будет вызвана функция расширения, и вы получитедоступ к coroutineContext .

Примечание: GlobalScope не рекомендуется использовать, это только для демонстрационных целей.

...