Promise
是ES_6的語法,針對JS做非同步的處理。
非同步就是不用等上一部執行完成,才做下一步,每個步驟是可以同步執行的。
一個Promise建構式在被創造時,必須傳入一個函式作為參數,這函式會帶有兩個參數-resolve
成功 or reject
失敗,其中只能回傳這兩結果其中之一也只能回傳一次,回傳後便結束Promise事件。
all/ race/ resolve/ reject
,並且有then/ catch/ finally
這些方法。
const creatPromise = new Promise((resolve, reject)=>{
/**成功時回傳的**/
resolve(status)
/**失敗時回傳的**/
reject(status)
}).then((data)=>{
/**用 then 接續成功時的處理**/
}).catch((error)=>{
/**用 catch 接續失敗時的處理**/
}).finally(() =>{
/**用 finally 表結束的處理**/
console.log("finish")
})
當一個then結束後,除了可以接catch表達失敗的結果,原本的then本身也可以在接另外一個then。
這時第二個then的callback function裡的參數,其實是第一個then所丟出來的回傳值,在收到值後產生新的promise物件,在呼叫建構式裡的resolve參數,把收到的值傳入。
XMLHttpRequest 是歷史擁久的WebAPI,主要可以操作HTTP請求,進行網路作業,擷取資料時,不需進行頁面reload。
以往的寫法
var url = 'https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json';
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function () {
if (req.status == 200) {
console.log(req.responseURL)
}
}
req.send()
function get(url)
,即可執行測試。 function get(url) {
return new Promise((resolve, reject) => {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function () {
if (req.status == 200) {
resolve(JSON.parse(req.response))
} else {
reject(Error(req))
};
}
req.send();
})
};
get('https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json')
.then((res) => {
console.log(res)
}).catch((res) => {
console.error(res)
})
在ES7 推出了Async/ Await
為讓非同步更加便利使用。
Async這個詞字面意思就是非同步,使用它所宣告的函式就是非同步函式,並且以Promise來達成。
用關鍵字Async function 宣告一個函式,並且加上await的運算式,等待Promise解析。例子
function trustGod(thinking) {
return new Promise(function (resolve, reject) {
var faith = "信者得永生";
var reason = "我還是得新冠了"
if (thinking) {
resolve(faith)
} else {
reject(reason);
}
})
}
async function test() {
console.log('執行test1:');
let test = await trustGod(true)
console.log('結果是:' + test)
-----------我是分隔線-----------------------
console.log('執行test2:');
test = await trustGod(false)
console.log("結果是:" + test)
}
------------------------------------------
console.log('start!!!');
test();
console.log('finish!!')
結果是
Learn More →
會先出現finish!!,是因爲遇到await trustGod
,會先把原本得同步執行玩,在繼續等待解析回傳的resolved 值,若遇到解析失敗rejected,則被拋出外面,並附加原因(如圖中紅色警語般)。
可以執行非Promise的內容!
await
可以直接將100轉換成 Promise.resolve(),並等待解析他
async function showNum(){
var x = await 100;
console.log(x) //100
}
showNum();
javascript
,觀念
建立一個音樂播放器使使用者能自由播放音樂,選取想要播放的音樂位置,調整音量及曲目。 成品頁面 成品功能 播放/ 暫停音樂 選擇前一首歌/ 下一首歌 使用者可以調整歌曲音量 根據總曲目數量,設定條件讓歌曲循環播放
Jul 1, 2021weight:100% 若沒有給預設值,會自動填滿整個瀏覽器的頁面寬 height:100% 沒有預設值,沒寫就是null height的百分比值需要父元素有一個有效的高度值才能起作用 -ex.height: 100%; margin: 0; padding: 0; }
Jun 20, 2021區塊元素(display: block), 盡可能佔滿整個版面的元素 就算改變第一個元素的寬度,第二個元素不會接在第一個元素後,會另起一行進行呈現。 可以以 display:inline變成行內元素 常見標籤<h1 ~ h6>、<div>、<p> 行內元素(display:inline) 常用在段落裡
Jun 2, 2021能夠將電腦亂排順序的名單,自由選取排列,排列正確會變綠色,順序錯誤會是紅色。 純HTML畫面 成品畫面 HTML 再HTML建立空白的無序列表,等JS再將內容加至設定好的ul,最後再加上一個button以執行JS已確認排序是否正確。 <h1>Top 10 Videos on Youtube 2020</h1>
Apr 9, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up