J'essaie d'obtenir la valeur d'une simple requête ajax, mais je ne comprends pas comment faire cela. Voici le code:
Rx.Observable
.ajax({ url: 'https://jsonplaceholder.typicode.com/posts', method: 'GET', responseType: 'json' })
.subscribe(function(data) { return data.response; });
J'ai cherché partout et il n'y a pas d'explication simple.
Merci!
Observable.ajax
peut accepter string
ou Object
avec l'interface suivante:
interface AjaxRequest { url?: string; // URL of the request body?: any; // The body of the request user?: string; async?: boolean; // Whether the request is async method?: string; // Method of the request, such as GET, POST, PUT, PATCH, DELETE headers?: Object; // Optional headers timeout?: number; password?: string; hasContent?: boolean; crossDomain?: boolean; //true if a cross domain request, else false withCredentials?: boolean; createXHR?: () => XMLHttpRequest; //a function to override if you need to use an alternate XMLHttpRequest implementation progressSubscriber?: Subscriber<any>; responseType?: string; }
Et voici des exemples:
const { Observable, combineLatest } = rxjs; // = require("rxjs")
const { ajax } = rxjs.ajax; // = require("rxjs/ajax")
const { map } = rxjs.operators; // = require("rxjs/operators")
// simple GET request example
const simple$ = ajax('https://httpbin.org/get');
// POST request example
const complex$ = ajax({
url: 'https://httpbin.org/post',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-rxjs-is': 'Awesome!'
},
body: {
hello: 'World!',
}
});
const htmlSubscription = combineLatest(simple$, complex$)
.subscribe(([simple, complex]) => {
const simpleResponse = JSON.stringify(simple.response, null, 2);
const complexResponse = JSON.stringify(complex.response, null, 2);
document.getElementById('root').innerHTML = `
<div>
<span><b>GET</b> https://httpbin.org/get</span>
<pre>${simpleResponse}</pre>
<span><b>POST</b> https://httpbin.org/post</span>
<pre>${complexResponse}</pre>
</div>`;
});
<script src="https://unpkg.com/[email protected]/bundles/rxjs.umd.min.js"></script>
<div id="root">loading ...</div>
Version TypeScript
"dependencies": {
"rxjs": "^5.1.0"
}
et
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/dom/ajax';
import 'rxjs/add/observable/combineLatest';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/startWith';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/catch';
const posts$ = Observable
.ajax('https://jsonplaceholder.typicode.com/posts')
.map(e => e.response);
const htmlSubscription = posts$
.subscribe(res => {
console.log(JSON.stringify(res, null, 2));
});
Vous voulez utiliser switchMap ..
const response$ = request$.switchMap((url) => {
console.log(url);
return fetch(url).then(res => res.json());
});
switchMap aplatit un flux de flux et le convertit en un flux qui n'émet que les réponses aux flux internes. Si un second innerStream est émis, le premier flux est tué et le second procède de son côté.
Voir cette corbeille où les démos écoutaient les requêtes via HTTP. Https://jsbin.com/duvetu/32/edit?html,js,console,output