170 похожих чатов

Всем доброго времени суток! Изучаю ноду и библиотеку mongoose, столкнулся

с проблемой понимания коллбеков и промисов.

А именно: я хочу выполнить запрос к монге и достать оттуда ID документа, присвоив это значение в переменную в конструкторе класса для дальнейшего переиспользования, выглядит это примерно так:

class MyBankService {
constructor(token) {
this.bankId = undefined;
this.#getBankId().then(bank => {
this.bankId = bank.id
})
console.log("bank id:", this.bankId)
}

#getBankId() {
return models.Bank.findOne({name: "myBank"})
}

Получается что когда происходит вызов console.log("bank id:", this.bankId), здесь будет undefined т.к это срабатывает раньше чем промис then().

Как это можно решить? Соре если вопрос глупый, но мне пока реально сложно привыкнуть к тому что все построено через промисы и колбеки и как в таком случае прокидывать стейт куда-то выше наружу

11 ответов

3 просмотра

А если в then вызвать console.log?

rglitchard- Автор вопроса

только что попробовал. Да, так сработает, спасибо! Я думал здесь у промисов then вызывать можно лишь 1 раз, а при последующих вызовах ничего уже не произойдет) но в итоге все работает и можно вызывать из разных мест

Да, тут ещё async await можно использовать, тут всё как во фронте, ну а так, рад помочь)

Не пиши асинхронный код в конструкторе. Напиши отдельный публичный асинхронный метод, в котором ты начала вытянешь свой bankId, а потом инициализируешь обьект и вернёшь его

rglitchard- Автор вопроса

что-то сложно пока понять как это сделать из описания, можно где-то глянуть пример такого подхода?)

Google me help

https://nekobin.com/firelatoxu

Либо так class MyClass { constructor(bankId) { this.bankId = bankId; } static build(token) { const bank = await this.#getBankId(token); return new MyClass(token); } } const myClass = await MyClass.build('some-token') Либо так class MyClass { constructor(token) { return (async () => { const bank = await this.#getBankId(token); this.bankId = bank.id; return this; })() } } const myClass = await new MyClass('some-token')

* не публичный, а статичный

зачем ты делаешь страшно

конкретно?

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
17
Есть вопрос: допустим есть железка с каким-то интерфейсом(допустим usb), но как по этому интерфейсу железкой управлять неизвестно, прог нету, а управлять очень хочется надо. К...
Mixail Frolov
15
а как ловят такое ghci> res <- getPos2 urlt 0 (alist !! 0) 200 ghci> res SearchAtom (Search "www.google.com" "/search?q=" "Haskell") "haskell.org" (SearchTS [(2024-05-06 07:...
Fedor
14
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
13
Карта сайта