# Как обратиться к \`api.addPosterIcon\` изнутри функции

**URL:** https://meta.discourse.org/t/how-to-refer-to-api-addpostericon-from-inside-of-a-function/202975
**Category:** Development
**Created:** [08.Сентябрь.2021 15:20:12 UTC](https://meta.discourse.org/t/how-to-refer-to-api-addpostericon-from-inside-of-a-function/202975 "2021-09-08T15:20:12Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![Ilia](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ilia/32/227945_2.png) [@Ilia](https://meta.discourse.org/u/Ilia)
#### Post date: [08.Сентябрь.2021 15:20:12 UTC](https://meta.discourse.org/t/how-to-refer-to-api-addpostericon-from-inside-of-a-function/202975/1 "2021-09-08T15:20:12Z")

</div>

Привет,

Подскажите, пожалуйста, как обратиться к **`api.addPosterIcon`** изнутри функции?

**Пример:**

```plaintext
<script type="text/discourse-plugin" version="0.8">
   api.onPageChange(url => {
       if (Discourse?.currentUser?.admin) {
           extract_associated_user_data();
       }
   });
   function extract_associated_user_data() {
       // много кода выше, и теперь мы готовы вызвать функцию `addPosterIcon`
       api.addPosterIcon(function(data, attrs) {
            return { icon: 'user', className: 'customer' };
       });
   }
</script>

```

Если **`api.addPosterIcon`** переместить на верхний уровень, всё работает, однако при запуске изнутри **`extract_associated_user_data`** функция просто молча ничего не делает (не выполняется). Возможно, _ **`this`** _ как-то сбивается внутри, но я не уверен, как к нему обратиться. Я уже перепробовал множество вариантов перед тем, как задать этот вопрос.

Надеюсь, это также будет полезно будущим разработчикам.

Мы используем последнюю версию Discourse 2.8.0.beta6 (cba8b39607).

---

<div class="post-metadata">

### Author: ![blattersturm](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blattersturm/32/76134_2.png) [@blattersturm](https://meta.discourse.org/u/blattersturm)
#### Post date: [08.Сентябрь.2021 16:19:32 UTC](https://meta.discourse.org/t/how-to-refer-to-api-addpostericon-from-inside-of-a-function/202975/2 "2021-09-08T16:19:32Z")

</div>

Реализация сниппетов `text/discourse-plugin` в темах, судя по всему, выглядит следующим образом:

> <https://github.com/discourse/discourse/blob/88aa0136e372b232b89e1298d87e67ad9a4cb27f/app/models/theme_field.rb#L107-L122>

Я не вижу здесь прямого упоминания экземпляра `this`, что подразумевает, что это не связано с неявным `this` в JavaScript, и это также не может быть выходом `api` за пределы области видимости, поскольку сниппет вставлен непосредственно туда.

Действительно ли этот минимальный пример работает, или проблема заключается в пропущенном коде?

Кстати: глобальный объект `Discourse` и его поле `currentUser` здесь также можно заменить на `api.getCurrentUser()`:

> <https://github.com/discourse/discourse/blob/11a07b37e15f20f5de960243b9ad611fd477af6b/app/assets/javascripts/discourse/app/lib/plugin-api.js#L121-L122>

---

<div class="post-metadata">

### Author: ![Ilia](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ilia/32/227945_2.png) [@Ilia](https://meta.discourse.org/u/Ilia)
#### Post date: [08.Сентябрь.2021 16:48:28 UTC](https://meta.discourse.org/t/how-to-refer-to-api-addpostericon-from-inside-of-a-function/202975/3 "2021-09-08T16:48:28Z")

</div>

> [@blattersturm](#):
>
> Глобальную переменную `Discourse` и её поле `currentUser` здесь также можно заменить на `api.getCurrentUser()`:

Отлично, спасибо.

Интересно, почему **`api.getCurrentUser()`** работает без проблем внутри функции, а **`api.addPosterIcon`** всё ещё нет?

Я хотел бы по возможности использовать нативный API, а не писать собственные решения (что, впрочем, не является проблемой).
