Open Bug 958905 Opened 12 years ago Updated 3 years ago

Task.Result API has unintuitive behavior

Categories

(Toolkit :: General, defect)

26 Branch
defect

Tracking

()

UNCONFIRMED

People

(Reporter: jeremy, Unassigned)

Details

User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0 conkeror/1.0pre (Beta/Release) Build ID: git Steps to reproduce: Consider the code below: Components.utils.import("resource://gre/modules/Task.jsm"); Task.spawn(function() { try { // do some stuff that may throw throw new Task.Result(1); } catch(e) { dump("Got exception: " + e + "\n"); throw e; } }).then(function(x) { dump("Result: " + x + "\n"); }); Actual results: Got exception: [object Object] Result: 1 Obviously this behavior is inherent to how exceptions work, but it is inconvenient that the only API for returning a value from a Task differs significantly in semantics from the normal return statement. Expected results: Result: 1 A better API would be to use the syntax: yield Task.Result(x); Supporting this syntax would be nearly backwards-compatible with existing code, in that only the edge case of using yield my_function(), where my_function() is a non-generation function that happens to return an instance of Task.Result, would be broken by supporting the new syntax (and it seems this would constitute a misuse of Task.Result in that case). The existing throw-based syntax could also still be supported at the same time, but deprecated. Note: The Conkeror web browser (based on Mozilla) has a coroutine implementation that is very similar in function to Task.jsm. I faced this same issue in writing it, having initially chosen a throw-based API for returning values, and then switching to a yield-based one after realizing throw would have the wrong behavior with respect to catch clauses.
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.