摘要:上說你可以使用構(gòu)造函數(shù)創(chuàng)建一個(gè)新的對(duì)象。使用對(duì)象完成與請(qǐng)求的通信。服務(wù)端使用重要的點(diǎn)在于不能直接使用這樣返回給前端會(huì)直接報(bào)錯(cuò)。前端的代碼要注意的第三個(gè)參數(shù)設(shè)置成將請(qǐng)求設(shè)置為異步,然后由于超時(shí)會(huì)取消請(qǐng)求,所以這里根本不需要來顯式的取消請(qǐng)求
MDN上說:
你可以使用AbortController.AbortController()構(gòu)造函數(shù)創(chuàng)建一個(gè)新的AbortController對(duì)象。 使用AbortSignal 對(duì)象完成與DOM請(qǐng)求的通信。
對(duì)于瀏覽器的兼容性有很高的要求,chrome在66版本以上, firefox在57以上,由于遇到了這樣的需求,所以用傳統(tǒng)的XHR實(shí)現(xiàn)了一下這個(gè)功能。
服務(wù)端使用koa2:
/** * @vividw * 2019.1.10 */ const Koa = require("koa"); const app = new Koa(); const Router = require("koa-router"); const router = new Router(); const { resolve } = require("path"); const koaStatic = require("koa-static"); const cors = require("@koa/cors"); const sleep = (count) => new Promise(resolve => { setTimeout(resolve, count); }); // router.get("/", async (ctx, next) => { // ctx.body = "Hello,Wolrd!"; // // await next(); // }); router.get("/data", async (ctx, next) => { await sleep(3000); ctx.body = { data: "12345" } await next(); }); app .use(cors()) .use(koaStatic(resolve(__dirname + "/"))) .use(router.routes()) .use(router.allowedMethods()); app.listen(3000, () => { console.log("App running!"); });
重要的點(diǎn)在于不能直接使用setTimeout(ctx.body = "12345" ,3000);這樣返回給前端會(huì)直接報(bào)錯(cuò)。
前端的代碼:
const ownFetch = (count) => new Promise((resolve,reject) => { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ if(xhr.status == 200){ resolve(xhr); } } } xhr.timeout = count; xhr.open("get", "http://localhost:3000/data", true); xhr.send(); }) window.onload = () => { const timeout = (count) => new Promise((resolve, reject) => { setTimeout(() => { reject("failed"); }, count); }); (async () => { ownFetch(2000); })(); }
要注意xhr.open()的第三個(gè)參數(shù)設(shè)置成true將AJAX請(qǐng)求設(shè)置為異步,然后由于超時(shí)會(huì)取消請(qǐng)求,所以這里根本不需要xhr.abort()來顯式的取消請(qǐng)求
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/100931.html
摘要:的執(zhí)行與狀態(tài)無關(guān)當(dāng)?shù)玫綘顟B(tài)不論成功或失敗后就會(huì)執(zhí)行,原文鏈接參考鏈接對(duì)象 同期異步系列文章推薦談一談javascript異步j(luò)avascript異步中的回調(diào)javascript異步與promisejavascript異步之Promise.resolve()、Promise.reject()javascript異步之Promise then和catchjavascript異步之a(chǎn)sync...
摘要:本身是一個(gè)構(gòu)造函數(shù),用來生成數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)具有的屬性構(gòu)造函數(shù),默認(rèn)是函數(shù)。舉例鏈?zhǔn)絼h除某個(gè)鍵清空對(duì)象是一個(gè)構(gòu)造函數(shù),用來生成實(shí)例,是異步編程的一種解決方案。構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是函數(shù)和。 1、 Set 和 Map數(shù)據(jù)結(jié)構(gòu) Set 數(shù)據(jù)結(jié)構(gòu) Set 類似數(shù)組,但是成員是唯一的,不存在重復(fù)值。 Set本身是一個(gè)構(gòu)造函數(shù),用來生成Set數(shù)據(jù)結(jié)構(gòu)。 Set...
摘要:應(yīng)用把一個(gè)異步操作和定時(shí)器放在一起。如果定時(shí)器先觸發(fā)就提示用戶超時(shí)用戶超時(shí)什么是值穿透或者期望傳入一個(gè)函數(shù)如果不是函數(shù)會(huì)發(fā)生值穿透和的第二個(gè)參數(shù)的區(qū)別比較類似是一個(gè)語法糖相當(dāng)于還有一點(diǎn)區(qū)別就是如果第一個(gè)報(bào)錯(cuò)第二個(gè)無法捕獲。 Promise使用細(xì)節(jié) 使用promise需要注意的幾點(diǎn): 1.如何用promise實(shí)現(xiàn)并行的異步 (Promise.all配合.map) Promise.all...
摘要:可信任性確定性在解決上述的回調(diào)函數(shù)的問題之前,有必要先來認(rèn)識(shí)一下的一些主要方法的起點(diǎn)執(zhí)行結(jié)果依次是,,,代碼解讀以上代碼體現(xiàn)了的如下特性一旦決議調(diào)用過一次或者就不再重復(fù)調(diào)用決議回調(diào)或者改變決議回調(diào)。 通過回調(diào)來理解Promise 我們都知道Promise的出現(xiàn)是為了規(guī)避回調(diào)地獄的,由此,我們先來深入了解一下回調(diào)的缺陷: 回調(diào) 1、缺乏信任 2、不確定性 Example var mo...
閱讀 769·2021-11-23 09:51
閱讀 835·2021-11-23 09:51
閱讀 2503·2021-11-15 18:01
閱讀 3864·2021-10-11 11:07
閱讀 2397·2021-09-22 15:30
閱讀 1075·2021-09-22 14:59
閱讀 1557·2019-08-30 15:55
閱讀 1753·2019-08-30 15:52