Я использую сагу о сокращении в своем проекте, и это моя сага для получения данных из базы данных.
export function* fetchCollectionsAsync() {
try {
const collectionRef = firestore.collection("collections");
const snapshot = yield collectionRef.get();
if (snapshot.empty) yield put(fetchCollectionsFailure("snapshot is empty"));
//call is the effect inside of our generator function that invokes the method.
//we want to yield collectionsMap incase async code takes longer we expect.
const collectionsMap = yield call(convertCollectionSnapshotToMap, snapshot);
//sagas do not dispatch actions using dispatch
yield put(fetchCollectionsSuccess(collectionsMap));
} catch (e) {
yield put(fetchCollectionsFailure(e));
}
}
когда эта функция вызывается первой, она будет передана в стек вызовов, новый будет создан контекст выполнения, и будет возвращен объект итератора , который используется для управления выполнением функции генератора.
Итак, после того, как объект итератора будет возвращен, эта функция генератора будет вытолкнута из стека, но он не будет полностью отброшен, он будет в состоянии Suspended . Поскольку итератор сохраняет ссылку на эту функцию, его контекст выполнения будет активен, пока итератору он нужен. Каждый раз, когда мы вызываем iterator.next (), он повторно активирует контекст выполнения и снова передает его в стек вызовов.
Если эта функция генератора имела оператор возврата, когда программа встречает «возврат», она завершает работу генератора ; s выполнение путем перевода генератора в завершенное состояние.
это мои общие знания о функции генератора и контексте выполнения в javascript. Меня беспокоит то, что я ничего не возвращаю из этой функции генератора (и у меня есть другие функции генератора для разных саг), ее контекст выполнения будет активен, и он не будет собираться мусором.
Я завершил свой проект, но когда я развертываю его на heroku, процесс сборки проходит успешно, но поскольку он значительно превышает квоту, мое приложение не запускается. Я думаю, что эти саги могут вызвать утечку памяти, и я подозреваю, что саги могут вызвать проблему.