Когда я запускаю линтер, он говорит:

subscribe is deprecated: Use an observer instead of an error callback

Код (из приложения angular 7 с angular-cli):

 this.userService.updateUser (данные) .pipe (
       нажмите (() => {бла бла бла})
    ).подписываться(
       this.handleUpdateResponse.bind (это),
       this.handleError.bind (это)
    );

Не знаю, что и как использовать ...

Спасибо!

Ответы (7)

подписка не устарела, устарел только тот вариант, который вы используете. В будущем subscribe будет принимать только один аргумент: либо обработчик next (функция), либо объект-наблюдатель.

Итак, в вашем случае вы должны использовать:

.subscribe({
   next: this.handleUpdateResponse.bind(this),
   error: this.handleError.bind(this)
});

См. Следующие проблемы на GitHub:

Интересно отметить, что объект наблюдатель может также (все еще) содержать метод complete () и другие дополнительные свойства. Пример:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

Таким образом, некоторые методы намного проще пропустить. При использовании старой подписи необходимо было указать undefined и придерживаться порядка аргументов. Теперь это намного яснее, когда, например, предоставляется только следующий и полный обработчик.

Вам следует заменить tslint на eslint.

Поскольку TSLint устарел, он не поддерживает @ устаревший синтаксис RXJS. ESLint - это правильный линтер для правильного выполнения линтинга подписки.

Я получил предупреждение, потому что передавал это для подписки:

myObs.subscribe(() => someFunction());

Поскольку он возвращает одно значение, оно несовместимо с сигнатурой функции subscribe.

При переключении на это предупреждение исчезло (возвращает null / void);

myObs.subscribe(() => {
  someFunction();
});

Для меня это была просто версия машинописного текста, на которую указывал мой VSCode.

VSCode status bar

TypeScript version selector

Select local TypeScript version

Получил помощь от этого Комментарий GitHub.

Я считаю, что это проблема с машинописным текстом. Что-то в новейших версиях машинописного текста заставляет это предупреждение отображаться в коде vs. Я смог заставить его уйти, щелкнув версию машинописного текста в правом нижнем углу vs code, а затем выбрав вариант выбора версии машинописного текста. Я установил для него версию node_modules, которую мы установили в нашем проекте angular, которая в нашем случае оказалась 4.0.7. Это привело к исчезновению предупреждений.

Я перенес свой проект Angular с TSLint на ESLint, и теперь предупреждение больше не отображается!

Я выполнил эти шаги. (В конце каждого шага я также рекомендую фиксировать изменения)

  1. Добавить eslint: ng add @ angular-eslint / schematics

  2. Преобразовать tslint в eslint: ng g @ angular-eslint / schematics: convert-tslint-to-eslint

  3. Удалить tslint и codelyzer: npm удалить -S tslint codelyzer

  4. Если вы хотите автоматически исправлять многие проблемы с линтами ng lint --fix (Также будут перечислены не исправленные проблемы)

  5. В VSCode удалите плагин TSLint, установите ESLint плагин и перезагрузите VSCode.

  6. Убедитесь, что он обновил пакет и файлы блокировки пакета. Также node_modules в вашем проекте.

  7. Если у вас есть файлы tsconfig.json в подкаталоге - вам необходимо добавить / обновить projects-root-directory / .vscode / settings.json с помощью подкаталог, в котором находятся файлы tsconfig!

    {
      "eslint.workingDirectories": [
        "подкаталог-где-tsconfig-files-находятся"
      ]
    }
    
  • Angular миграция с TSLint на ESLint Ссылка

Вы можете получить эту ошибку, если у вас есть объект, набранный как Observable | Наблюдаемый - в отличие от Наблюдаемый .

Например:

    const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');

Компилятор делает не make obs типа Observable .

Вас может удивить, что следующее приведет к ошибке Используйте наблюдателя вместо полного обратного вызова и Ожидаемые 2-3 аргумента, но получили 1.

obs.subscribe(value => {

});

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

Чтобы вернуть Observable <число | строка> вместо Наблюдаемое <число> | Наблюдаемая <строка>. Тонкости этого будут зависеть от того, что вы делаете.

2022 WebDevInsider