123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- unit utils;
- {$mode objfpc}{$H+}
- interface
- uses
- sysutils, JS, web;
- var
- fakeSlowNetwork : boolean;
- function wait(ms : NativeInt) : TJSPromise;
- function get(url : string) : TJSPromise;
- function getJson(url : string) : TJSPromise;
- procedure addHtmlToPage(Content : string);
- Procedure addTextToPage(content : string) ;
- Procedure InitSlowNetwork;
- implementation
- function wait(ms : NativeInt) : TJSPromise;
- procedure doTimeout(resolve,reject : TJSPromiseResolver) ;
- begin
- window.setTimeout(TJSTimerCallBack(resolve),ms);
- end;
- begin
- Result := TJSPromise.New(@doTimeOut);
- end;
- Procedure InitSlowNetwork;
- Const
- lsKey = 'fake-slow-network';
- Var
- networkFakeDiv : TJSHTMLElement;
- checkbox : TJSHTMLInputElement;
- procedure doChange;
- begin
- window.localStorage.setItem(lsKey,IntToStr(Ord(checkbox.checked)));
- window.location.reload(false);
- end;
- begin
- networkFakeDiv:=TJSHTMLElement(document.querySelector('.network-fake'));
- checkbox:=TJSHTMLInputElement(networkFakeDiv.querySelector('input'));
- fakeSlowNetwork:=window.localStorage.getItem(lsKey)='1';
- networkFakeDiv.style.setProperty('display','block');
- checkbox.checked:=fakeSlowNetwork;
- checkbox.addEventListener('change',@doChange)
- end;
- function get(url : string) : TJSPromise;
- // Return a new promise.
- // We do all the work within the constructor callback.
- procedure DoRequest(resolve,reject : TJSPromiseResolver) ;
- var
- req : TJSXMLHttpRequest;
- function DoOnLoad(event : TEventListenerEvent) : boolean;
- begin
- // On error we reject, otherwise we resolve
- if (req.status=200) then
- resolve(req.responseText)
- else
- reject(TJSError.New(req.statusText));
- end;
- function DoOnError(event : TEventListenerEvent) : boolean;
- begin
- // On error we reject
- reject(TJSError.New('Network Error'));
- end;
- begin
- req:=TJSXMLHttpRequest.new;
- req.open('get', url);
- req.addEventListener('load',@DoOnLoad);
- req.addEventListener('error',@DoOnError);
- req.send();
- end;
- function ReturnResult(res: JSValue) : JSValue;
- begin
- // Result is an array of resolve values of the 2 promises, so we need the second one.
- Result:=TJSArray(res)[1];
- end;
- var
- fakeNetworkWait,
- requestPromise : TJSPromise;
- begin
- fakeNetworkWait := Wait(trunc(3000 * random * Ord(fakeSlowNetwork)));
- requestPromise:=TJSPromise.New(@DoRequest);
- Result:=TJSPromise.all([fakeNetworkWait, requestPromise])._then(@ReturnResult);
- end;
- function getJson(url : string) : TJSPromise;
- Function DoConvert(aValue : JSValue) : JSValue;
- begin
- Result:=TJSJSON.parse(String(aValue));
- end;
- begin
- Result:=get(url)._then(@DoConvert);
- end;
- procedure addHtmlToPage(Content : string);
- var
- aDiv, storyDiv : TJSElement;
- begin
- aDiv:=document.createElement('div');
- StoryDiv:=document.querySelector('.story');
- aDiv.innerHTML:=content;
- storyDiv.appendChild(aDiv);
- end;
- Procedure addTextToPage(content : string) ;
- var
- aDiv, storyDiv : TJSElement;
- begin
- aDiv:=document.createElement('p');
- StoryDiv:=document.querySelector('.story');
- aDiv.textContent:=content;
- storyDiv.appendChild(aDiv);
- end;
- end.
|