Rxjs 5 - 简单 Ajax 请求
Rxjs 5 - Simple Ajax Request
我正在尝试从一个简单的 ajax 请求中获取值,但我不知道该怎么做。这是代码:
Rx.Observable
.ajax({ url: 'https://jsonplaceholder.typicode.com/posts', method: 'GET', responseType: 'json' })
.subscribe(function(data) { return data.response; });
我到处找,没有简单的解释。
谢谢!
Observable.ajax
可以接受 string
或 Object
,接口如下:
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;
}
这里是例子:
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/rxjs@6.2.2/bundles/rxjs.umd.min.js"></script>
<div id="root">loading ...</div>
您想使用 switchMap ..
const response$ = request$.switchMap((url) => {
console.log(url);
return fetch(url).then(res => res.json());
});
switchMap 将流的流展平并将其转换为仅发出内部流响应的流。如果发出第二个 innerStream,则第一个流被终止,第二个流自行进行。
查看此 bin,它演示了通过 HTTP 流式传输请求..https://jsbin.com/duvetu/32/edit?html,js,console,output
打字稿版本
"dependencies": {
"rxjs": "^5.1.0"
}
和
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));
});
我正在尝试从一个简单的 ajax 请求中获取值,但我不知道该怎么做。这是代码:
Rx.Observable
.ajax({ url: 'https://jsonplaceholder.typicode.com/posts', method: 'GET', responseType: 'json' })
.subscribe(function(data) { return data.response; });
我到处找,没有简单的解释。
谢谢!
Observable.ajax
可以接受 string
或 Object
,接口如下:
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; }
这里是例子:
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/rxjs@6.2.2/bundles/rxjs.umd.min.js"></script>
<div id="root">loading ...</div>
您想使用 switchMap ..
const response$ = request$.switchMap((url) => {
console.log(url);
return fetch(url).then(res => res.json());
});
switchMap 将流的流展平并将其转换为仅发出内部流响应的流。如果发出第二个 innerStream,则第一个流被终止,第二个流自行进行。
查看此 bin,它演示了通过 HTTP 流式传输请求..https://jsbin.com/duvetu/32/edit?html,js,console,output
打字稿版本
"dependencies": {
"rxjs": "^5.1.0"
}
和
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));
});