Angular 2 settimeout это не определено

Я пытаюсь настроить setTimeout внутри переключателя, который находится внутри foreach, внутри функции ...

TypeError: undefined не является объектом (оценка this.Data)

я пытался

import { DataProvider } from '../xml-provider';
constructor(private Data: DataProvider) { }
items = this.Data.xmldata['step'];  //XML turned into array using 

initiateStepActions(){
    var actionsToTake = this.items[this.currentStep]['timed_actions'];
    if (actionsToTake){
        this.items[this.currentStep]['timed_actions'][0]['action'].forEach(function(foundAction){
          switch (type) {
            case 'customerchat':
              var MesgObject = {text : foundAction['_']};
              //setTimeout(() => {this.Data.broadcastCustomerChatMesg(MesgObject)}, Number(foundAction['$']['showAtSecond']));
              //setTimeout (() => this.Data.broadcastCustomerChatMesg(MesgObject), Number(foundAction['$']['showAtSecond']));
              //setTimeout ( (this.Data.broadcastCustomerChatMesg(MesgObject)).bind(this), Number(foundAction['$']['showAtSecond']));
              //setTimeout (this.Data.broadcastCustomerChatMesg(MesgObject), Number(foundAction['$']['showAtSecond']));
              setTimeout (function(this) { this.Data.broadcastCustomerChatMesg(MesgObject)}, Number(foundAction['$']['showAtSecond']));

              TypeError: undefined is not an object (evaluating 'this.Data.broadcastCustomerChatMesg')
              break;

            case 'supportchat':
              console.info('send a support chat message ');
              break;

            default:
              console.info('defaulted');
          } //end switch
    });// end foreach
  }
}

Все они получают неопределенную ошибку.

Разместите больше кода, чтобы мы имели некоторое представление о контексте вызова (или о том, что вы ожидаете от него).

CertainPerformance 06.05.2018 09:53

Не могли бы вы добавить окружающий foreach, пожалуйста?

user184994 06.05.2018 10:07

добавленный код, надеюсь, имеет больше смысла.

Mark 06.05.2018 18:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
359
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда ты пишешь

.forEach(function(foundAction){

this больше не ссылается на ваш класс, а на анонимную функцию. Вы должны использовать функцию стрелки

.forEach(fundAction => {

И сделайте то же самое в setTimeout, чтобы не передавать ссылку на this.

он работает .forEach ((foundAction) => {а затем setTimeout (() => {сделал свое дело!

Mark 06.05.2018 21:45

Другие вопросы по теме