# JavaScript Async 範例
XMLHttpRequest - 請於新增單一則 post 完成並收到回應後,再發出拿到所有 post 的請求,當拿到貼文後,再發出刪除最後一篇貼文的請求
```javascript=1
function reqListener() {
var oReq2 = new XMLHttpRequest();
oReq2.addEventListener("load", function () {
var oReq3 = new XMLHttpRequest();
oReq3.addEventListener("load", function (e) {
console.log(e.target.responseText);
});
oReq3.open("DELETE", "http://localhost:3000/posts/5");
oReq3.send();
});
oReq2.open("GET", "http://localhost:3000/posts");
oReq2.send();
}
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
var data = {};
data.title = 'The Adventures of Tom'
data.author = 'Mark Twain'
oReq.open("POST", "http://localhost:3000/posts");
oReq.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
oReq.send(JSON.stringify(data));
```
---
JQuery - 請於新增單一則 post 完成並收到回應後,再發出拿到所有 post 的請求,當拿到貼文後,再發出刪除最後一篇貼文的請求
```javascript=1
$.ajax({
method: 'POST',
url: 'http://localhost:3000/posts',
data: {
title: 'The Adventures of Tom',
author: 'Mark Twain'
}
})
.done(function(value) {
$.get( "http://localhost:3000/posts").done(function(value) {
$.ajax({
method: 'DELETE',
url: 'http://localhost:3000/posts/11',
})
});
})
.fail(function(value) {
console.log('error', value);
})
.always(function(value) {
console.log('complete', value);
});
```
---
fetch - 請於新增單一則 post 完成並收到回應後,再發出拿到所有 post 的請求,當拿到貼文後,再發出刪除最後後一篇貼文的請求
```javascript=1
postData('http://localhost:3000/posts', {
title: 'The Adventures of Tom',
author: 'Mark Twain'
})
.then(data => getData('http://localhost:3000/posts'))
.then(data => deleteData('http://localhost:3000/posts/30'))
.catch(error => console.error(error))
function postData(url, data) {
// Default options are marked with *
return fetch(url, {
body: JSON.stringify(data), // must match 'Content-Type' header
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, same-origin, *omit
headers: {
'content-type': 'application/json'
},
method: 'POST', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, cors, *same-origin
redirect: 'follow', // manual, *follow, error
referrer: 'no-referrer', // *client, no-referrer
})
.then(response => response.json()) // 輸出成 json
}
function getData(url){
return fetch(url)
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
}
function deleteData(url, data) {
// Default options are marked with *
return fetch(url, {
method: 'DELETE', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, cors, *same-origin
})
.then(response => response.json()) // 輸出成 json
}
```
---
fetch - 請嘗試更新 id 為 100 的貼文,完成並收到回應後,再發出拿到所有 post 的請求,如果發生錯誤請使用console.error() 抓住錯誤
```javascript=1
putData('http://localhost:3000/posts/100', {
title: 'The Adventures of Tom1',
author: 'Mark Twain1'
})
.then(data => getData(data)) // JSON from `response.json()` call
.catch(error => console.error(error))
function putData(url, data) {
// Default options are marked with *
return fetch(url, {
body: JSON.stringify(data), // must match 'Content-Type' header
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, same-origin, *omit
headers: {
'content-type': 'application/json'
},
method: 'PUT', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, cors, *same-origin
redirect: 'follow', // manual, *follow, error
referrer: 'no-referrer', // *client, no-referrer
})
.then(response => response.json()) // 輸出成 json
}
function getData(url){
return fetch(url)
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
}
```
---
rxjs - 請接續上一範例,不要讓 observable 在 got value 5 的時候結束,延後一秒,產生 got value 6 ,再結束
```javascript=1
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
subscriber.next(3);
setTimeout(() => {
subscriber.next(4);
}, 1000);
setTimeout(() => {
subscriber.next(5);
subscriber.complete();
}, 2000);
});
console.log('just before subscribe');
const observer = {
next: function(x) { console.log('got value ' + x); },
error: function(err) { console.error('something wrong occurred: ' + err); },
complete: function() { console.log('done'); }
}
const subscription = observable
.pipe(map(item => (+item + 1)))
.subscribe(observer);
console.log('just after subscribe');
```