国产探花免费观看_亚洲丰满少妇自慰呻吟_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,就可以把很多異步任務以并行和串行的方式組合起來執行。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万州区| 固始县| 遵义县| 应用必备| 周口市| 泌阳县| 南京市| 德昌县| 铁岭市| 怀集县| 厦门市| 商河县| 田林县| 高陵县| 务川| 乌鲁木齐县| 游戏| 若羌县| 中宁县| 武功县| 项城市| 商洛市| 德阳市| 桐庐县| 岗巴县| 汝州市| 安康市| 秦安县| 镇江市| 景德镇市| 福贡县| 南投市| 泰顺县| 墨江| 阿瓦提县| 阜康市| 峨边| 漳浦县| 两当县| 辽阳市| 江陵县|