private def retrieveSongId(songName: String): Option[JsValue] = {
val geniusStringResponse = Http("https://api.genius.com/search?q=" + formattedSongName)
.param("access_token", apiKey)
.asString
.body
//Extra processing with geniusStringResponse
}
}
由于HTTP请求,上述功能是否会被视为副作用?如果是这样,这样的Scala代码是否合适?
答案 0 :(得分:3)
是的,调用此函数具有发出HTTP请求的副作用。调用此函数可能会影响另一个函数(例如 //app.filter.ts
//from here data is getting from components.ts file and returning data to same ts file and the data i am sending to html file and there i am rendering data to display
import{ Pipe, PipeTransform} from '@angular/core';
@Pipe({
name:"filter"
})
export class FilterPipe implements PipeTransform{
newVal : any=[]
filterdata=[];
transform(value:any, search){
// console.log(value)
if(search===undefined){
return value;
}
else{
this.filterdata=[];
for(let k of value){
// console.log(k)
if(k.city.toLowerCase().indexOf(search)==search.indexOf(search)){
// console.log(search)
this.filterdata.push(k);
}
}
}return this.filterdata;
}
}
//component.ts file
//here entire logic goes here and data keep here with some data key name and the logic is build by the data getting from filter data
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-autocomplte-pagination',
templateUrl: './autocomplte-pagination.component.html',
styleUrls: ['./autocomplte-pagination.component.css']
})
export class AutocompltePaginationComponent implements OnInit {
constructor(
) { }
public search: any;
public data : any =[];
public noOfItemsToShowInitially: number = 5;
public itemsToLoad: number = 1;
public isFullListDisplayed: boolean = false;
public itemsToShow;
public countries: any = [
{ 'city': 'abbeville', 'state': 'Louisiana' },
{ 'city': 'Aberdeen', 'state': 'Maryland' },
{ 'city': 'Aberdeen', 'state': 'Mississippi' },
{ 'city': 'Aberdeen', 'state': 'South Dakota' },
{ 'city': 'Aberdeen', 'state': 'Washington' },
{ 'city': 'Abilene', 'state': 'Texas' },
{ 'city': 'Abilene', 'state': 'Kansas' },
{ 'city': 'Abingdon', 'state': 'Virginia' },
{ 'city': 'Abington', 'state': 'Massachusetts' },
{ 'city': 'Abington', 'state': 'Massachusetts' },
{ 'city': 'Absecon', 'state': 'New Jersey' },
{ 'city': 'Accokeek', 'state': 'Maryland' },
{ 'city': 'Acton', 'state': 'Massachusetts' },
{ 'city': 'Acushnet', 'state': 'Massachusetts' },
{ 'city': 'Acworth', 'state': 'Georgia' },
{ 'city': 'Ada', 'state': 'Oklahoma' },
{ 'city': 'Adams', 'state': 'Massachusetts' },
{ 'city': 'Addison', 'state': 'Illinois' },
{ 'city': 'Addison', 'state': 'Texas' },
{ 'city': 'Adelanto', 'state': 'California' },
{ 'city': 'Adelphi', 'state': 'Maryland' },
{ 'city': 'Adrian', 'state': 'Michigan' },
{ 'city': 'Affton', 'state': 'Missouri' },
{ 'city': 'Agawam', 'state': 'Massachusetts' },
{ 'city': 'Agoura Hills', 'state': 'California' },
{ 'city': 'Ahuimanu', 'state': 'Hawaii' },
{ 'city': 'Aiea', 'state': 'Hawaii' },
{ 'city': 'Aiken', 'state': 'South Carolina' },
{ 'city': 'Air Force Academy', 'state': 'Colorado' },
{ 'city': 'Airmont', 'state': 'New York' },
{ 'city': 'Akron', 'state': 'Ohio' },
{ 'city': 'Alabaster', 'state': 'Alabama' },
{ 'city': 'Alachua', 'state': 'Florida' },
{ 'city': 'Alameda', 'state': 'California' },
{ 'city': 'Alamo', 'state': 'California' },
{ 'city': 'Alamo', 'state': 'Texas' },
{ 'city': 'Alamo Heights', 'state': 'Texas' },
{ 'city': 'Alamogordo', 'state': 'New Mexico' },
{ 'city': 'Alamosa', 'state': 'Colorado' },
{ 'city': 'Albany', 'state': 'Georgia' },
{ 'city': 'Albany', 'state': 'California' },
{ 'city': 'Albany', 'state': 'New York' },
{ 'city': 'Albany', 'state': 'Oregon' },
{ 'city': 'Albemarle', 'state': 'North Carolina' },
{ 'city': 'Albert Lea', 'state': 'Minnesota' },
{ 'city': 'Albertville', 'state': 'Alabama' },
{ 'city': 'Albion', 'state': 'Michigan' },
{ 'city': 'Albion', 'state': 'New York' },
{ 'city': 'Albion', 'state': 'New York' },
{ 'city': 'Albuquerque', 'state': 'New Mexico' },
{ 'city': 'Alcoa', 'state': 'Tennessee' },
{ 'city': 'Alden', 'state': 'New York' },
{ 'city': 'Alderwood Manor', 'state': 'Washington' },
{ 'city': 'Aldine', 'state': 'Texas' },
{ 'city': 'Alexander City', 'state': 'Alabama' },
{ 'city': 'Alexandria', 'state': 'Indiana' },
{ 'city': 'Alexandria', 'state': 'Minnesota' },
{ 'city': 'Alexandria', 'state': 'Kentucky' },
{ 'city': 'Alexandria', 'state': 'Louisiana' },
{ 'city': 'Alexandria', 'state': 'Virginia' },
{ 'city': 'Algonquin', 'state': 'Illinois' },
{ 'city': 'Alhambra', 'state': 'California' },
{ 'city': 'Alice', 'state': 'Texas' },
{ 'city': 'Aliquippa', 'state': 'Pennsylvania' },
{ 'city': 'Aliso Viejo', 'state': 'California' },
{ 'city': 'Allegany', 'state': 'New York' },
{ 'city': 'Allen', 'state': 'Texas' },
{ 'city': 'Allen Park', 'state': 'Michigan' },
{ 'city': 'Allendale', 'state': 'Michigan' },
{ 'city': 'Allendale', 'state': 'New Jersey' },
{ 'city': 'Allentown', 'state': 'Pennsylvania' },
{ 'city': 'Alliance', 'state': 'Ohio' },
{ 'city': 'Alliance', 'state': 'Nebraska' },
{ 'city': 'Allouez', 'state': 'Wisconsin' },
{ 'city': 'Alma', 'state': 'Michigan' },
{ 'city': 'Aloha', 'state': 'Oregon' },
{ 'city': 'Alondra Park', 'state': 'California' },
{ 'city': 'Alpena', 'state': 'Michigan' },
{ 'city': 'Alpharetta', 'state': 'Georgia' },
{ 'city': 'Alpine', 'state': 'California' },
{ 'city': 'Alpine', 'state': 'Utah' },
{ 'city': 'Alsip', 'state': 'Illinois' },
{ 'city': 'Alta Sierra', 'state': 'California' },
{ 'city': 'Altadena', 'state': 'California' },
{ 'city': 'Altamont', 'state': 'Oregon' },
{ 'city': 'Altamont', 'state': 'New York' },
{ 'city': 'Altamonte Springs', 'state': 'Florida' },
{ 'city': 'Alton', 'state': 'Illinois' },
{ 'city': 'Altoona', 'state': 'Iowa' },
{ 'city': 'Altoona', 'state': 'Pennsylvania' },
{ 'city': 'Altoona', 'state': 'Wisconsin' },
{ 'city': 'Altus', 'state': 'Oklahoma' },
{ 'city': 'Alum Rock', 'state': 'California' },
{ 'city': 'Alvin', 'state': 'Texas' },
{ 'city': 'Amarillo', 'state': 'Texas' },
{ 'city': 'Ambler', 'state': 'Pennsylvania' },
{ 'city': 'Ambridge', 'state': 'Pennsylvania' },
{ 'city': 'American Canyon', 'state': 'California' },
{ 'city': 'American Fork', 'state': 'Utah' },
{ 'city': 'Americus', 'state': 'Georgia' },
{ 'city': 'Ames', 'state': 'Iowa' },
{ 'city': 'Amesbury', 'state': 'Massachusetts' },
{ 'city': 'Amesbury', 'state': 'Massachusetts' },
{ 'city': 'Amherst', 'state': 'New Hampshire' },
{ 'city': 'Amherst', 'state': 'Massachusetts' },
{ 'city': 'Amherst', 'state': 'Ohio' },]
ngOnInit() {
this.itemsToShow = this.countries.slice(0, this.noOfItemsToShowInitially);
}
loadmore(select) {
if (this.noOfItemsToShowInitially <= this.countries.length) {
// Update ending position to select more items from the array
this.noOfItemsToShowInitially += this.itemsToLoad;
this.itemsToShow = this.countries.slice(0, this.noOfItemsToShowInitially);
}
else {
this.isFullListDisplayed = true;
}
}
}
//app.module.ts file
//this is entire module.ts file and importing each and every file to get the out if anything miss out please do add any imports to need to run
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule} from '@angular/forms';
import { RouterModule, Routes} from '@angular/router';
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
import { ScrollEventModule } from 'ngx-scroll-event';
import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';
import { AutocompltePaginationComponent } from './autocomplte-pagination/autocomplte-pagination.component';
import{ FilterPipe} from './app.filter';
import {NgAutoCompleteModule} from "ng-auto-complete";
const routes : Routes = ([
{ path : 'login', component : LoginComponent},
{path : 'autocomplte-pagination', component : AutocompltePaginationComponent}
])
@NgModule({
declarations: [
AppComponent,
LoginComponent,
AutocompltePaginationComponent,
FilterPipe
],
imports: [
BrowserModule,
FormsModule,
RouterModule.forRoot(routes),
InfiniteScrollModule,
ScrollEventModule,
NgAutoCompleteModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
)的结果,并且在输入值相同的情况下(例如,服务器始终不可用),该函数可能会返回不同的结果。
但这并不意味着它不合适。任何可用的Scala程序都将产生副作用,但诀窍是使它们尽可能地受到约束。一个编写良好的Scala程序将具有一组丰富的副作用免费类和函数,以及调用它们的相对较轻的非功能代码层。
例如,在这种情况下,您应该具有一个执行HTTP请求的简单函数和一个处理结果的第二个函数。结果处理功能可以是纯功能代码,并且可以使用模拟数据进行有效测试。