国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

JS(六)promise

2024-04-27 15:09:48
字體:
來源:轉載
供稿:網友
javaScript的世界中,所有代碼都是單線程執行的。由于這個“缺陷”,導致Javascript的所有網絡操作,瀏覽器事件,都必須是異步執行。異步執行可以用回調函數實現:function callback() {    console.log('Done');}console.log('before setTimeout()');setTimeout(callback, 1000); // 1秒鐘后調用callback函數console.log('after setTimeout()');觀察上述代碼執行,在Chrome的控制臺輸出可以看到:before setTimeout()after setTimeout()(等待1秒后)Done可見,異步操作會在將來的某個時間點觸發一個函數調用。Ajax就是典型的異步操作。以上一節的代碼為例:request.onreadystatechange = function () {    if (request.readyState === 4) {        if (request.status === 200) {            return success(request.responseText);        } else {            return fail(request.status);        }    }}把回調函數success(request.responseText)和fail(request.status)寫到一個AJAX操作里很正常,但是不好看,而且不利于代碼復用。有沒有更好的寫法?比如寫成這樣:var ajax = ajaxGet('http://...');ajax.ifSuccess(success)    .ifFail(fail);這種鏈式寫法的好處在于,先統一執行AJAX邏輯,不關心如何處理結果,然后,根據結果是成功還是失敗,在將來的某個時候調用success函數或fail函數。古人云:“君子一諾千金”,這種“承諾將來會執行”的對象在JavaScript中稱為xmlHttpRequest();    return new Promise(function (resolve, reject) {        request.onreadystatechange = function () {            if (request.readyState === 4) {                if (request.status === 200) {                    resolve(request.responseText);                } else {                    reject(request.status);                }            }        };        request.open(method, url);        request.send(data);    });}var log = document.getElementById('test-promise-ajax-result');var p = ajax('GET', '/api/categories');p.then(function (text) { // 如果AJAX成功,獲得響應內容    log.innerText = text;}).catch(function (status) { // 如果AJAX失敗,獲得響應代碼    log.innerText = 'ERROR: ' + status;});Result:除了串行執行若干異步任務外,Promise還可以并行執行異步任務。試想一個頁面聊天系統,我們需要從兩個不同的URL分別獲得用戶的個人信息和好友列表,這兩個任務是可以并行執行的,用Promise.all()實現如下:var p1 = new Promise(function (resolve, reject) {    setTimeout(resolve, 500, 'P1');});var p2 = new Promise(function (resolve, reject) {    setTimeout(resolve, 600, 'P2');});// 同時執行p1和p2,并在它們都完成后執行then:Promise.all([p1, p2]).then(function (results) {    console.log(results); // 獲得一個Array: ['P1', 'P2']});有些時候,多個異步任務是為了容錯。比如,同時向兩個URL讀取用戶的個人信息,只需要獲得先返回的結果即可。這種情況下,用Promise.race()實現:var p1 = new Promise(function (resolve, reject) {    setTimeout(resolve, 500, 'P1');});var p2 = new Promise(function (resolve, reject) {    setTimeout(resolve, 600, 'P2');});Promise.race([p1, p2]).then(function (result) {    console.log(result); // 'P1'});由于p1執行較快,Promise的then()將獲得結果'P1'。p2仍在繼續執行,但執行結果將被丟棄。如果我們組合使用Promise,就可以把很多異步任務以并行和串行的方式組合起來執行。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平陆县| 广西| 纳雍县| 贵港市| 东方市| 威宁| 蓝山县| 黔西县| 高台县| 宁城县| 浦江县| 通城县| 桃源县| 同江市| 子长县| 塔河县| 庄浪县| 睢宁县| 桐梓县| 藁城市| 嵊州市| 六枝特区| 唐海县| 南开区| 五大连池市| 中牟县| 阆中市| 犍为县| 仁化县| 武宣县| 镇坪县| 南江县| 昌乐县| 定襄县| 临澧县| 米泉市| 和田县| 红原县| 长葛市| 合江县| 株洲县|