Angular 2's RXJS observable failing to retain reference to 'this' object

Hey there! I'm currently working on an Angular 2 application and running into some trouble with observables for HTTP requests. Everything seems to work well in general, but I'm curious as to why it appears to be losing track of 'this'?

loginWithEmailAndPassword(email: string, password: string){
    let headers = new Headers({ 'Content-Type': 'application/json'});
    let options = new RequestOptions({ headers: headers});
    return this.http.post('auth/login', {email: email, password: password}, options)
                    .map(this.extractData)
                    .catch(this.handleError)
}
private extractData(res: Response) {
    let body = res.json();
    // console.log(body);
    if (body.token){
         this.saveToken(body.token);
         localStorage.setItem('token', body.token);
    }

    return body || {}
}
private saveToken(token: string){ 
    localStorage.setItem('token', token);
}

Within the block

 if (body.token){
         this.saveToken(body.token);
         localStorage.setItem('token', body.token);
    }

I encounter the error

user.service.ts:54 TypeError: this.saveToken is not a function
at MapSubscriber.webpackJsonp.../../../../../src/app/user/user.service.ts.UserService.extractData [as project] (user.service.ts:31)
at MapSubscriber.webpackJsonp.../../../../rxjs/operator/map.js.MapSubscriber._next (map.js:77)
at MapSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
at XMLHttpRequest.onLoad (http.es5.js:1226)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
at Object.onInvokeTask (core.es5.js:3881)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:191)
at XMLHttpRequest.ZoneTask.invoke (zone.js:486)

Could someone advise me on the correct way to reference other methods within a class using this pattern? It seems unlikely that we should revert back to var self = this

Answer №1

Revise this line

.map(this.extractData)

to

.map(data => this.extractData(data))

The reason for this change is that the scoping of the original code differs. In the first version, using this refers to the function itself, while in the second version with the fat arrow function, it ensures that this points to the outer scope of the function.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Can anyone tell me the method to retrieve the id of the current element that initiated the horizonSwiper event in JavaScript?

I successfully integrated horizonSwiper into my php(Yii2) website to display images from different albums in a horizontal row with the ability to scroll left and right. Now, I am looking to implement lazy loading when scrolling or swiping left/right. Howev ...

JavaScript slowness

Currently, I am developing a test page that consists of buttons triggering various scripts. One of the functionalities I am trying to implement is changing the background color every second for 5 seconds, cycling through a total of 5 different colors. Desp ...

Navigating Error: net::ERR_CONNECTION while utilizing Puppeteer

I attempted to utilize a proxy from the following site: Below is my Puppeteer scraping code (deployed on Heroku), encountering an error at the .goto() method, as mentioned in the title: const preparePageForTests = async (page) => { const userAgent = & ...

What are some effective methods for drawing attention to newly added table rows?

Whenever I input new data into my table, the data does not get highlighted as expected. However, the existing data in the table gets highlighted with no issues. Can you please help me troubleshoot why my code is not functioning correctly? Thank you. The f ...

Conceal the input field prior to making a selection from the dropdown menu

I have implemented a drop-down menu for selecting dependencies, similar to how it functions in JSFiddle. $('#user_time_zone').on('change', function() { dateCalender = $(this).val(); if (dateCalender == 'Single Date') { ...

Struggling with Ajax issues following a tutorial from Bucky

I previously watched a tutorial by Bucky and I am struggling to make this work, with the error message displayed as index.php:62 Uncaught TypeError: Cannot read property 'documentElement' of undefinedhandleServerResponse @ index.php:62 The Ja ...

Exploring query parameters for the main component within Angular IO

I'm working on a basic Angular 4+ application that pulls data from an API and displays it. My approach involves utilizing the root component as follows: {path: 'main', component: MainComponent} along with QueryParams such as ?id=1. Although ...

Transforming JavaScript/Angular 1 from using Promise.all to async-await technique

Within the $onInit() function, I set two web service calls to run concurrently and store their responses in variables named referencesPromise and contactTypesPromise. If necessary, a new method can be created for this purpose. $onInit() { const referenc ...

Steps to resolve the Uncaught SyntaxError: Unexpected token o in JSON at position 1 issue

$.ajax({ url: "/url/url.ajax?length=100000&startDate=2018-07-01", method: "get", dataType: "json", success: function (jdata) { var jsonData=JSON.parse(jdata.data); ...

Issue with jQuery mouseenter() function not meeting expectations

My goal is to create a div that changes its size when hovered over (using the mouseenter and mouseleave jQuery functions) and shows another div when clicked. However, I am experiencing inconsistent behavior with my jQuery code. Here is the code I am using: ...

The Ajax call is being made twice

A code snippet using jQuery to send data is being executed twice with a single click, resulting in two HTTP requests both receiving a 200 response. $(function() { $('input[type=submit]').click(function() { $(this).unbind("click"); ...

Tips for changing text color using JavaScript when hovering the mouse?

I am working on a website for a snow cone stand and am looking to add a unique effect to their flavor list. I want to create an interactive experience where hovering over a flavor name scales the text and changes its color to match the real fruit. Is the ...

The 'subscribe' property is not found in the type 'OperatorFunction<Response, Recipe[]>'

I'm encountering an issue while attempting to retrieve data from firebase "Property 'subscribe' does not exist on type 'OperatorFunction'" Any suggestions on what might be missing here? import { Injectable } from '@angula ...

The possibility exists that the onClick function may be null

I am encountering an issue with a props function that is showing an error message stating that the object may be null. import {Dropdown} from "react-bootstrap"; interface GenreButtonProps { key: number; id: number | null; genre: strin ...

The Observable pipeline is typically void until it undergoes a series of refreshing actions

The issue with the observable$ | async; else loading; let x condition usually leads to staying in the loading state, and it requires multiple refreshes in the browser for the data to become visible. Below is the code snippet that I utilized: // TypeScript ...

Stop the Decimal in MUI TextField

Having trouble creating a customized Currency Input? You may be experiencing an issue where the textfield prevents the input of decimals. Take a look at the code below for possible solutions. main.ts const [_val, setVal] = React.useState(""); const h ...

Is it possible for me to use the name "Date" for my component and still be able to access the built-in "new Date()" functionality?

Currently following the NextJS tutorial, but adding my own twist. In the NextJS example, the custom component is named "Date" (/components/date.js) and does not utilize the built-in Date() object in processing, making it unique to the file. In my scenario ...

Having trouble retrieving values from Promise.allSettled on Node.js 12 using TypeScript version 3.8.3

Currently, I am delving into NodeJs 12 and exploring the Promise.allSettled() function along with its application. The code snippet that I have crafted allows me to display the status in the console, but there seems to be a hitch when attempting to print t ...

Encountering Problems Retrieving API Information in React.JS

Currently, I'm tackling a project involving a React web application and running into an issue while trying to display specific data retrieved from a mock API: Below is the code snippet in question: import React, { Component } from 'react'; ...

Issues with Angular 9 application compatibility with IE11

Our Angular 9 project runs smoothly on Google Chrome and Firefox, but nothing appears on IE11. Despite trying various solutions found online and following related blogs, the issue remains unresolved. Here is a snippet from my tsconfig.json: { // Com ...