1.撬开技术难点!实现Fetch 请求扩展超时功能!
2.死磕以太坊源码分析之Fetcher同步
3.fetch 详解
4.PL/SQL cursorç¨äºFOR LOOPä¹åè¿å¯ä»¥ç¨fetchå
撬开技术难点!实现Fetch 请求扩展超时功能!
你是否遇到过使用 Fetch 请求时,无法控制超时时间的口袋工具 源码尴尬情况?
是否解决过,但解决方案过于局限,缺乏通用性和可重复性?
别担心,本文将教你如何使用 AbortController、高阶函数等技术,将原本不具备超时功能的 Fetch 请求进行扩展,实现通用且易复用的超时功能。
我们通过具体的实现方案和深入的技术分析,解决实际项目中可能遇到的各类问题,提升技术水平。
要实现基本的超时功能,只需使用 AbortController。代码如下所示:
请求已被取消。
设置超时时间后,金股格格 源码数据在毫秒返回,即使执行终止请求也无效。
封装通用的 request 函数,处理超时问题时,却发现事情变得更加复杂,需要考虑很多其他问题。
我们希望保持 Fetch 功能不变,封装时要谨慎,不能将其封装一遍,京东商城筛选源码以免小题大做。
分析 MockJS 库,它能拦截 Ajax 请求并返回模拟数据。其源码分析提示,这种方案虽然可行,但具有侵入性,可能影响系统中其他 fetch 函数。
为保持非侵入性和通用性,可以利用高阶函数处理。网上拍卖系统 源码通过测试,效果良好,超时后为拒绝的 Promise,后续处理不受影响。
通过本文学习如何添加超时功能,保持 Fetch 原有功能和通用性,分析 MockJS 源码,提高代码质量,为将来开发提供更多启发。安卓相框源码
死磕以太坊源码分析之Fetcher同步
区块数据同步分为被动同步和主动同步,Fetcher负责被动同步,主要任务包括接收新区块广播并进行同步。新产生的区块通过NewBlockHashesMsg 和 NewBlockMsg 进行传播,Fetcher对象通过接收这些消息发现新的区块信息。Fetcher在内部将同步过程分为几个阶段,并为每个阶段设置状态字段,用于记录阶段数据。首先同步区块哈希,当接收到哈希时,会将哈希标记在远程节点上,并在本地数据库中查找是否存在该哈希,若不存在,则放入unknown列表,之后通过channel通知本地fetcher模块请求该区块的header和body。fetcher模块根据接收的header和body状态,在fetching和completing列表中进行管理。当确认fetching和completing列表中不存在指定区块哈希时,将哈希放入到announced列表,并准备拉取header和body。fetcher模块通过fetchTimer周期性地从announced列表中选择区块哈希,进行header的拉取。拉取header时,选择要下载的区块,从announced转移到fetching中,并发送下载请求。header请求由远程节点通过GetBlockHeadersMsg处理,并返回给本地节点。header处理包括过滤和通知downloader对象。header过滤主要步骤涉及校验、过滤与本地数据库的不匹配块以及同步算法的header等。过滤后的header放入complete或incomplete列表。body同步的过程涉及从complete列表中选择哈希,进行同步body。body请求通过p.RequestBodies发送GetBlockBodiesMsg消息,并在downloader对象中处理。body过滤主要涉及过滤和同步逻辑,最终导入完整块到数据库。同步区块哈希和区块的整个流程涉及复杂的机制和逻辑,包括DOS攻击的防范、区块高度的限制、header和body的同步等,最终目标是确保本地区块链与远程节点保持同步状态。
fetch 详解
fetch请æ±åºæ¥äºä¸æ®µæ¶é´,çæçå¨é¡¹ç®ä¸ä½¿ç¨è¿.è¿æ¬¡å¥½å¥½å¦ä¹ æ±æ»ä¸ä¸.
第ä¸: fetchç使ç¨
/github/fetch è¿ä¸ªæ¯fetchçgithub ä¸é¢ç»åºäºfetchç¨æ³.
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch è¿ä¸ªæ¯fetchçmdnææ¡£,æ´å ç详ç».
æ¥ç两份ææ¡£çæ¶å,githubä¸é¢æ²¡æ设置headers èå¨ mdnä¸æ.ä¸å¼å§æä¹å¾è¿·è«,æåæ读å°äºä¸å¥è¯
å 为fetch ä¼èªå·±çå¹é æ°æ®ç±»å设置 content type, æ以åéjson æè formdata çå ¶ä»æ°æ®ç±»åçæ¶å,ä¸éè¦ä½ æå¨è®¾ç½®.
so intelligently.
æ以å¨å¤§é¨å使ç¨ççæ åµä¸,ç´æ¥ä½¿ç¨å°±è¡. åä¼ ç»çajaxæ¯èµ·æ¥,fetch 使ç¨èµ·æ¥æ´å æ¹ä¾¿,å°äºç¹ççé ç½®,åæ¯åºäºpromise,å¼åè ä¸æ³¨äºä¸å¡å°±è¡.
第äº: fetch ç缺ç¹
1.å ¼å®¹æ§,fetchçå ¼å®¹æ§å¹¶ä¸å¤ªå¥½,ie å safari é½ä¸æ¯æ
å¨ç§»å¨ç«¯åpc端 å ¼å®¹æ§ä¸å¥½å 为 è¿åçreponse body æ¯readable stream ä¸æ¯æ.
解å³æ¹æ¡: 使ç¨ç¬¬ä¸æ¹åº whatwg-fetch, å¦æåæå¨nodeç«¯ä½¿ç¨ isomorphic-fetch .
2.fetch 请æ±é»è®¤ä¸å¸¦cookie
å端请æ±çæ¶åé½ä¼è®¾è®¡å°token æééªè¯,å¾å¤æ¶åæ¯åå¨cookieéé¢ç.fetchéé¢åä¸ä¸ªåæ°credentials设计cookie
credentials æä¸ä¸ªå¼:
omit: é»è®¤å¼ï¼å¿½ç¥cookieçåé
same-origin: 表示cookieåªè½åååéï¼ä¸è½è·¨ååé
include: cookieæ¢å¯ä»¥åååéï¼ä¹å¯ä»¥è·¨ååé ( æ¨è使ç¨)
æ¨è使ç¨include.
3.fetch è·¨åé®é¢
fetchè·¨åä¹æ对åºçåæ°è®¾ç½®mode
same-originï¼è¯¥æ¨¡å¼æ¯ä¸å 许跨åçï¼å®éè¦éµå®åæºçç¥ï¼å¦åæµè§å¨ä¼è¿åä¸ä¸ªerroråç¥ä¸è½è·¨åï¼å ¶å¯¹åºçresponse type为basicã
cors: 该模å¼æ¯æè·¨å请æ±ï¼é¡¾åæä¹å®æ¯ä»¥CORSçå½¢å¼è·¨åï¼å½ç¶è¯¥æ¨¡å¼ä¹å¯ä»¥åå请æ±ä¸éè¦å端é¢å¤çCORSæ¯æï¼å ¶å¯¹åºçresponse type为corsã
no-cors: 该模å¼ç¨äºè·¨å请æ±ä½æ¯æå¡å¨ä¸å¸¦CORSååºå¤´ï¼ä¹å°±æ¯æå¡ç«¯ä¸æ¯æCORSï¼è¿ä¹æ¯fetchçç¹æ®è·¨å请æ±æ¹å¼ï¼å ¶å¯¹åºçresponse type为opaqueã
4.fetch è¿å é®é¢
å½ä¸ä¸ªè¯·æ±åéå®æ,æå¡è¿åç¶æç ,fetch ä¸ä¼rejectè¿ä¸ªresponse,ä»ç¶resolve,ä½æ¯ response.ok ä¼è®¾ç½®æfalse.å¾å¤æ¶åæ们ä¼äºæ¬¡å°è£ fetch reject error.
5 fetch æ æ³ abort è¯·æ± åtimeout
ç®åfetch 没æä¼ ç»ajax çabort æ¹æ³,è¿å¨èæ¡ä¹ä¸
ç»fetchå é¨çpromiseæ·»å ä¸ä¸ªabortæ¹æ³--å®é å°±æ¯rejectä¸ä¸ªerror.
使ç¨promise çrace, å 为promise éé¢çresolve å reject åªè½æ§è¡ä¸æ¬¡, å©ç¨race reject ä¸ä¸ªerror.
ä¸é¢çabort 并没æçæ£çabort æ¤æ¬¡è¯·æ±,åªæ¯éè¿promise promise reject ä¸ä¸ªerrorèå·².æå¨ç¿»é fetchçæºç çæ¶ååç°äºè¿ä¸ª
å¨é ç½®ä¸ç¡®å®åä¸ä¸ªsignal åæ°å¯ä»¥abort 请æ±,åç°æ¯åºäºAbortController,ä½æ¯è¿ä¸ªæ¯ä¸ä¸ªå®éªä¸å±æ§,åºæ¬ä¸è½ä½¿ç¨.
以ä¸æ¯æ对fetchç²æµ çæ»ç»,æä¸è¶³çå°æ¹æ¬¢è¿æåº.
PL/SQL cursorç¨äºFOR LOOPä¹åè¿å¯ä»¥ç¨fetchå
ä½ åªä¿®æ¹è¿ç¹ç¹æ¯ä¸å¤çï¼è¿è¦å é¤æFETCH,FOR游æ ä¸ä¸FETCHé å使ç¨ï¼ææè§ä½ 纯粹æ¯å¨ä¹±å
declare
cursor dept_cur is
select deptno, dname from dept where deptno < ;
cursor dept_cur2(pno number) is
select ename, job, hiredate, sal
from emp
where empno <
and deptno = pno;
begin
FOR dept_rec IN dept_cur LOOP
FOR dept_rec2 IN dept_cur2(dept_rec.deptno) LOOP
dbms_output.put_line(dept_rec.deptno || ' ' || dept_rec2.ename || ' ' ||
dept_rec2.job || ' ' ||
to_char(dept_rec2.hiredate, 'YYYY-MM-DD') || ' ' ||
dept_rec2.sal);
END LOOP;
END LOOP;
END;
è¿ä¸ªæ¯æç代ç