Javascript
這樣會發生什麼情況?
DOM會先PO post上去不等新的post創造好,所以永遠更新不到新的post
const posts = [{
title: 'Post One',
body: 'This is post one'
},
{
title: 'Post Two',
body: 'This is post two'
},
];
// 把取得的post貼到DOM上面 延遲一秒鐘
function getPost() {
setTimeout(() => {
let output = '';
posts.forEach((post, index) => {
output += `<li>${post.title}</li>`;
});
document.body.innerHTML = output;
}, 1000);
}
//創造一個新的post丟上去花了兩秒鐘
function createPost(post) {
setTimeout(() => {
posts.push(post);
}, 2000);
}
getPost();
createPost({
title: 'Post Three',
body: 'This is post Three'
});
使用callback代表getPosts,這樣一來就會在創造好新的post之後才會觸發getPosts整個過程會在兩秒內完成
需要注意callback的寫法在呼叫函式的部分撰寫的callback不需要加上()要特別留意
//創造一個新的post丟上去花了兩秒鐘
//這邊的callback就代表了getPosts所以必須等創造好了新的post之後
// getPost才會觸發也才會把取的的物件推上去DOM所以就可以顯示新的post搂!
function createPost(post, callback) {
setTimeout(() => {
posts.push(post);
callback();
}, 2000);
}
createPost({
title: 'Post Three',
body: 'This is post Three'
}, getPosts)
promise成功則會使用then()內部的函式順利的印出新的post
promise失敗(改寫error變數成true)則會顯示錯誤訊息在console裡面
也可以使用catch
方法抓取錯誤的內容
function createPost(post, ) {
//如果promise解決會呼叫resolve
//如果promise錯誤則呼叫reject
return new Promise((resolve, reject) => {
setTimeout(() => {
posts.push(post);
// 解釋promise內部的兩個參數的判斷是如何運作
const error = false;
if (!error) {
resolve();
} else {
reject('Error: something went wrong');
}
}, 2000);
});
}
createPost({
title: 'Post Three',
body: 'This is post three'
}).then(getPosts).catch(err => console.log(err));
常常promise會不只一個,一個一個接then太累了,所以可以使用promise.all一次抓住一同使用.then就好瞜!
const promise1 = Promise.resolve('hello world');
const promise2 = 10;
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 2000, 'Goodbye'));
Promise.all([promise1, promise2, promise3]).then(values => console.log(values));
最後.then的印出結果
使用fetch抓取資料的話必須轉化格式所以在指派給變數的階段就要先.then轉換格式
這樣才可以在promise.all的階段被真正抓取到資料
//使用兩個.then因為要轉換JSON格式
const promise4 = fetch('https://jsonplaceholder.typicode.com/users').then(res => res.json());
Promise.all([promise1, promise2, promise3, promise4]).then(values => console.log(values));
最後.then的印出結果
await
等待一個同步的過程或動作去完成後才去執行其他動作
等待createPost處理完內部的函式createPost後也就是創造新的post後,才會往getPosts去執行這樣就會顯示摟!
function createPost(post, ) {
return new Promise((resolve, reject) => {
setTimeout(() => {
posts.push(post);
const error = false;
if (!error) {
resolve();
} else {
reject('Error: something went wrong');
}
}, 2000);
});
}
// 等待createPost處理完成後,才會往getPosts去執行
async function init() {
await createPost({
title: 'Post Three',
body: 'This is post three'
});
getPosts();
}
init();
不用.then一切都更乾淨好讀
一樣fetch都需要資料轉換,但是這邊重新指派一個變數處理比較特別
async function fetchUsers() {
const res = await fetch('https://jsonplaceholder.typicode.com/users');
const data = await res.json();
console.log(data);
}
fetchUsers();
fetch的資料印出:
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing