rubycdp / ferrum

Headless Chrome Ruby API
https://ferrum.rubycdp.com
MIT License
1.7k stars 122 forks source link

Use Promise in example for #evaluate_async #325

Open ttilberg opened 1 year ago

ttilberg commented 1 year ago

Related to #234

I couldn't remember how to get a value back from evaluate_async and remembered I had created an example in a previous issue.

The existing example leverages arguments[0] and calls a simple object. Instead, I would like to see an actual, practical example using familiar things that people would commonly use this for.

Additionally, I think we should encourage usage of __f() as in the next example, instead of arguments[0], or rework the #evaluate_async template. As an example, if you call:

browser.evaluate_async '__f(arguments)', 5, "arg 1", 2, 3
# => ["arg 1", 2, 3, {}]

arguments[0] no longer refers to the fulfill callback. You end up receiving TypeError: arguments[0] is not a function (Ferrum::JavaScriptError).

Perhaps this highlights some tweaks that could be made to evaluate_async, but for now, I'd like to get this docs change up asap.

route commented 1 year ago

I don't like current API either, but I remember picking up the names for resolve and reject functions so that they don't collide with any other name (thus I added __), and now we are making them kinda explicit. Looking at:

browser.evaluate_async '__f(arguments)', 5, "arg 1", 2, 3

is so unreadable. I'm always confused when to put what, and use specs to remember how to use it. So maybe it's time to improve the API then if it's doable at all? :)

alexeyr-ci commented 10 months ago

Reminding about this PR because I just also was confused by arguments[0] in the README.