Hello whatever,

today I've read a very nice article about browsers' JS main loop and Web 
Workers [*] and it seems that Web Workers is exactly what you need. Like 
you said, JS is a single-thread, but Web Workers "break this rule": they 
are processed in separate threads and hence don't hang the interface. 
Still, they have their limitations: DOM can't be manipulated from a Web 
Worker. Hence, you should create a Web Worker and set an event handler: 
once the job is done by your Web Worker, you can change DOM. Normally WW 
are used with JS in a separate file, but this can be worked around using 
stuff like

var worker = new Worker( window.URL.createObjectURL( new 
BlobBuilder().append( "onmessage = function(e) { postMessage('hello 
habrahabr'); }" ).getBlob() ) ); worker.postMessage();

Another option is to use setTimeout instead of WW: in this trick JS bits 
(small enough) are executed between other stuff in the event loop and hence 
the interface doesn't hang [**].

Best regards,
Yakov.

[*] it's in Russian so probably not useful for you: 
https://habrahabr.ru/company/tradingview/blog/178261/
[**] see the first answer here: 
https://stackoverflow.com/questions/714942/how-to-stop-intense-javascript-loop-from-freezing-the-browser

вторник, 11 июля 2017 г., 21:59:02 UTC+3 пользователь whatever написал:
>
> Hey!
> I think the issue is that JS is a single-thread language, if I understand 
> correctly. I'm guessing that when you open the tiddler, the wikifier gets 
> the content, queues all the macros inside it and only shows the tiddler 
> once all macros have executed. I'll try playing around with Promises when I 
> have the time, but my understanding is not all that good.
> w
>
> On Tuesday, July 11, 2017 at 8:39:14 PM UTC+2, Yakov wrote:
>>
>> Well, it sounds like Promises might help you. I'm not sure yet about the 
>> blocking nature of JS for interface, but what you can do is the following:
>>
>> in handler, create a container and create a Promise to fill it – that 
>> Promise has to do the calculations;
>> chain another Promise to it, it has to grab the calculation results and 
>> build DOM.
>>
>> What I think I understand is that the 2 promises will be fullfilled after 
>> the whole code, meaning after other wikifying, so the user will see other 
>> content. What I'm not sure at all is whether the first Promise will or will 
>> not block user interface (I don't know well why this blocking happens at 
>> all). Once the calculation is done, the second Promise will work and that 
>> one will certainly block user interface but at least it is not the long 
>> part, if I've understood you correctly.
>>
>> I'm not familiar at all with Web Workers but looks like this is the 
>> second thing you should look into.
>>
>> Best regards,
>> Yakov.
>>
>> PS very interesting what you will come up with, I wonder if those tools 
>> can be used to make saving with TiddlyFox asynchronous (or more precisely, 
>> non-blocking), but I haven't learned enough stuff yet.
>>
>> понедельник, 10 июля 2017 г., 23:00:54 UTC+3 пользователь whatever 
>> написал:
>>>
>>> Hey, Yakov.
>>> My plugin processes parameters from internal tiddlers, no external 
>>> resources required. It's called InfoboxTablesPlugin [1] and I use it to 
>>> generate Wikipedia-style infoboxes. The current version that's publicly 
>>> available is not the latest though. The new version supports modules and 
>>> includes, and I found that when the number of available parameters gets 
>>> over a hundred, the wiki freezes until the plugin is done processing. Only 
>>> then is the tiddler displayed. These are extreme test cases, of course, but 
>>> the wiki is a bit slow even when there are fewer parameters to process.
>>> I have seen the SO thread you posted, but I haven't had the time to play 
>>> around yet.
>>> I have also joined the TWC group.:D
>>>
>>> [1] http://infoboxes.tiddlyspot.com/
>>>
>>> w
>>>
>>> On Monday, July 10, 2017 at 9:47:08 PM UTC+2, Yakov wrote:
>>>>
>>>> Hello whatever,
>>>>
>>>> could you specify what kind of computation does this macro require? 
>>>> Does it make any requests to external sources?
>>>>
>>>> This may be of use: 
>>>> https://stackoverflow.com/questions/36588775/are-javascript-promise-asynchronous
>>>>
>>>> Best regards,
>>>> Yakov.
>>>>
>>>> PS you may be interested in joining the new TiddlyWikiClassic group: 
>>>> https://groups.google.com/forum/#!forum/tiddlywikiclassic
>>>>
>>>> пятница, 30 июня 2017 г., 23:45:00 UTC+3 пользователь whatever написал:
>>>>>
>>>>> Bump.
>>>>>
>>>>> On Thursday, June 22, 2017 at 5:48:38 PM UTC+2, whatever wrote:
>>>>>>
>>>>>> Hi!
>>>>>> I'm working on a plugin, which, depending on the amount of data it 
>>>>>> needs to process, can take up to a minute to render. In the mean time, 
>>>>>> the 
>>>>>> TWC is practically frozen. Is there any way to delay the processing of 
>>>>>> the 
>>>>>> macro until the tiddler is loaded? Or delay the processing part of the 
>>>>>> macro? Which would actually be preferable, if I could display a 
>>>>>> placeholder 
>>>>>> message that the macro is processing stuff. I've played with setTimeout, 
>>>>>> both inside and outside of the handler, but it didn't work. Any ideas?
>>>>>>
>>>>>> w
>>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to tiddlywiki+unsubscr...@googlegroups.com.
To post to this group, send email to tiddlywiki@googlegroups.com.
Visit this group at https://groups.google.com/group/tiddlywiki.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/12111c47-755a-4568-a7da-00b6816b59f3%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to