-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Future.immediate() should still be async. #3356
Comments
For the record, Microsoft added a setImmediate(): http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html |
This issue came up when people wanted a platform-independent way to do new Timer(0, func) or window.setTimeout(0, func). So there are two issues: the need for a Future.spawn() which creates a new asynchronous queued closure, and the fact that a synchronous Future.immediate() may be confusing and error prone. So even if Future.immediate remains sync, there is still a request for Future.spawn (or Future.async, or Future.queue). |
cc @sigmundch. |
As Bill mentioned we need a platform-independent [Timer]. We are finally starting the process of moving Timer out of io. Once that's available everywhere, we will have all calls to [then] execute asynchronously (I personally like the suggestion [of]). |
I like "of" too. |
Using Timer isn't ideal, since on browsers it will take at least 4ms to complete. I filed 5691 for some type of deferred function mechanism, like setImmediate(), except that I think it's best if Futures complete in the current event loop. setImmediate() calls at the beginning of the next event loop. Removed the owner. |
can we have an event that is 'at the end of this event loop'? cc @justinfagnani. |
ok never mind my earlier comment - I see that this is addressed in dartbug.com/5691 |
I believe this is now fixed with libv2 in the new 'dart:async' library. cc @floitschG. |
Do you mean runAsync ? |
Sorry, I was mostly referring to comment #1. I think what Bob was asking for in comment #1 is covered by the Future.immediate and Future.of constructors. To cover what I mentioned in #7 we would need something like runAsync, which I think is what's tracked in issue #1 and issue #0 |
Just for everyone following along at home, Future.of() runs its callback now but makes the value available asynchronously. (as is my understanding?) |
This comment was originally written by pr...@gmail.com That should satisfy issue #2705 then I think Seth. |
Changes: ``` > git log --format="%C(auto) %h %s" 8f5ab7b..94ae66a https://dart.googlesource.com/pub.git/+/94ae66a6 Refine what a relative uri means in a git path (#3212) https://dart.googlesource.com/pub.git/+/cc4c1292 Only call Package.listFiles once per publish. (#3346) https://dart.googlesource.com/pub.git/+/f4484073 Fix test/global/activate/git_package_test test on windows (#3361) https://dart.googlesource.com/pub.git/+/610ce7f2 Refactor descriptors (#3305) https://dart.googlesource.com/pub.git/+/953b6097 Substitute pub.dartlang.org for of pub.dev (#3358) https://dart.googlesource.com/pub.git/+/7a6ea396 Add support for pubspec overrides file (#3215) https://dart.googlesource.com/pub.git/+/8abfed9d Global activate git path and ref (#3356) https://dart.googlesource.com/pub.git/+/d1c0e3f9 Revert "Add flag controlling creation of `.packages` file. (#2757)" (#3357) https://dart.googlesource.com/pub.git/+/274f5ad9 Fix signals test (#3359) https://dart.googlesource.com/pub.git/+/83437005 Avoid failing in gitignore validator (#3354) https://dart.googlesource.com/pub.git/+/3082796f dependency_services: Don't download archives on apply (#3352) https://dart.googlesource.com/pub.git/+/48d0ffaf dependency_services: Use ^ constraints for widened intervals when possible (#3349) https://dart.googlesource.com/pub.git/+/826e2086 Remove obsolete test (#3347) https://dart.googlesource.com/pub.git/+/35e5140b Bump analyzer from 2.8.0 to 3.3.1 (#3341) https://dart.googlesource.com/pub.git/+/52f2bdc2 Enable dependabot (#3340) https://dart.googlesource.com/pub.git/+/1e70c0c7 Remove `uploader` command (#3335) https://dart.googlesource.com/pub.git/+/3174a264 Warn if git version is not high enough for supporting all features (#3332) https://dart.googlesource.com/pub.git/+/3f7a3cb7 Don't analyze ignored directories in directory-validator (#3331) https://dart.googlesource.com/pub.git/+/e8f36614 Allow use of token for talking to pub.dev (#3330) https://dart.googlesource.com/pub.git/+/b93bf88f Upgrade `package:tar` to version `0.5.4`. (#3313) https://dart.googlesource.com/pub.git/+/fbc9732e Support for different versioning strategies in dependency_services (#3320) https://dart.googlesource.com/pub.git/+/93c7cfcd Update repository-spec-v2.md (#3311) https://dart.googlesource.com/pub.git/+/941191f7 dependency_services (#3304) https://dart.googlesource.com/pub.git/+/61175cb6 fix: relative to the current directory rules (#3297) https://dart.googlesource.com/pub.git/+/f27e90d3 Upgrade other versions conservatively with --major-versions (#3295) https://dart.googlesource.com/pub.git/+/a2461417 Add flag controlling creation of `.packages` file. (#2757) ``` Diff: https://dart.googlesource.com/pub.git/+/8f5ab7b1aba3b9f66b56246d77e167990339d317~..94ae66a660cc187cc46ceaf1ab96bdcf8d48a313/ Change-Id: I121fa281ad77991ef10938a3c228ce1d62e748db Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238901 Reviewed-by: Jonas Jensen <jonasfj@google.com> Commit-Queue: Sigurd Meldgaard <sigurdm@google.com>
This reverts commit 6e00bb1. Reason for revert: https://ci.chromium.org/ui/p/dart/builders/ci.sandbox/flutter-engine-linux/16089/overview Original change's description: > Bump pub to 94ae66a660cc187cc46ceaf1ab96bdcf8d48a313 > > Changes: > ``` > > git log --format="%C(auto) %h %s" 8f5ab7b..94ae66a > https://dart.googlesource.com/pub.git/+/94ae66a6 Refine what a relative uri means in a git path (#3212) > https://dart.googlesource.com/pub.git/+/cc4c1292 Only call Package.listFiles once per publish. (#3346) > https://dart.googlesource.com/pub.git/+/f4484073 Fix test/global/activate/git_package_test test on windows (#3361) > https://dart.googlesource.com/pub.git/+/610ce7f2 Refactor descriptors (#3305) > https://dart.googlesource.com/pub.git/+/953b6097 Substitute pub.dartlang.org for of pub.dev (#3358) > https://dart.googlesource.com/pub.git/+/7a6ea396 Add support for pubspec overrides file (#3215) > https://dart.googlesource.com/pub.git/+/8abfed9d Global activate git path and ref (#3356) > https://dart.googlesource.com/pub.git/+/d1c0e3f9 Revert "Add flag controlling creation of `.packages` file. (#2757)" (#3357) > https://dart.googlesource.com/pub.git/+/274f5ad9 Fix signals test (#3359) > https://dart.googlesource.com/pub.git/+/83437005 Avoid failing in gitignore validator (#3354) > https://dart.googlesource.com/pub.git/+/3082796f dependency_services: Don't download archives on apply (#3352) > https://dart.googlesource.com/pub.git/+/48d0ffaf dependency_services: Use ^ constraints for widened intervals when possible (#3349) > https://dart.googlesource.com/pub.git/+/826e2086 Remove obsolete test (#3347) > https://dart.googlesource.com/pub.git/+/35e5140b Bump analyzer from 2.8.0 to 3.3.1 (#3341) > https://dart.googlesource.com/pub.git/+/52f2bdc2 Enable dependabot (#3340) > https://dart.googlesource.com/pub.git/+/1e70c0c7 Remove `uploader` command (#3335) > https://dart.googlesource.com/pub.git/+/3174a264 Warn if git version is not high enough for supporting all features (#3332) > https://dart.googlesource.com/pub.git/+/3f7a3cb7 Don't analyze ignored directories in directory-validator (#3331) > https://dart.googlesource.com/pub.git/+/e8f36614 Allow use of token for talking to pub.dev (#3330) > https://dart.googlesource.com/pub.git/+/b93bf88f Upgrade `package:tar` to version `0.5.4`. (#3313) > https://dart.googlesource.com/pub.git/+/fbc9732e Support for different versioning strategies in dependency_services (#3320) > https://dart.googlesource.com/pub.git/+/93c7cfcd Update repository-spec-v2.md (#3311) > https://dart.googlesource.com/pub.git/+/941191f7 dependency_services (#3304) > https://dart.googlesource.com/pub.git/+/61175cb6 fix: relative to the current directory rules (#3297) > https://dart.googlesource.com/pub.git/+/f27e90d3 Upgrade other versions conservatively with --major-versions (#3295) > https://dart.googlesource.com/pub.git/+/a2461417 Add flag controlling creation of `.packages` file. (#2757) > > ``` > > Diff: https://dart.googlesource.com/pub.git/+/8f5ab7b1aba3b9f66b56246d77e167990339d317~..94ae66a660cc187cc46ceaf1ab96bdcf8d48a313/ > Change-Id: I121fa281ad77991ef10938a3c228ce1d62e748db > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238901 > Reviewed-by: Jonas Jensen <jonasfj@google.com> > Commit-Queue: Sigurd Meldgaard <sigurdm@google.com> TBR=sigurdm@google.com,jonasfj@google.com Change-Id: I2402e8647ad79a613d8be55a85a7f05f511a4081 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239301 Reviewed-by: Sigurd Meldgaard <sigurdm@google.com> Reviewed-by: Jonas Jensen <jonasfj@google.com> Commit-Queue: Sigurd Meldgaard <sigurdm@google.com>
Changes: ``` > git log --format="%C(auto) %h %s" 8f5ab7b..a3a102a https://dart.googlesource.com/pub.git/+/a3a102a5 Fix equality and hashcode for the sdk descriptors (#3367) https://dart.googlesource.com/pub.git/+/94ae66a6 Refine what a relative uri means in a git path (#3212) https://dart.googlesource.com/pub.git/+/cc4c1292 Only call Package.listFiles once per publish. (#3346) https://dart.googlesource.com/pub.git/+/f4484073 Fix test/global/activate/git_package_test test on windows (#3361) https://dart.googlesource.com/pub.git/+/610ce7f2 Refactor descriptors (#3305) https://dart.googlesource.com/pub.git/+/953b6097 Substitute pub.dartlang.org for of pub.dev (#3358) https://dart.googlesource.com/pub.git/+/7a6ea396 Add support for pubspec overrides file (#3215) https://dart.googlesource.com/pub.git/+/8abfed9d Global activate git path and ref (#3356) https://dart.googlesource.com/pub.git/+/d1c0e3f9 Revert "Add flag controlling creation of `.packages` file. (#2757)" (#3357) https://dart.googlesource.com/pub.git/+/274f5ad9 Fix signals test (#3359) https://dart.googlesource.com/pub.git/+/83437005 Avoid failing in gitignore validator (#3354) https://dart.googlesource.com/pub.git/+/3082796f dependency_services: Don't download archives on apply (#3352) https://dart.googlesource.com/pub.git/+/48d0ffaf dependency_services: Use ^ constraints for widened intervals when possible (#3349) https://dart.googlesource.com/pub.git/+/826e2086 Remove obsolete test (#3347) https://dart.googlesource.com/pub.git/+/35e5140b Bump analyzer from 2.8.0 to 3.3.1 (#3341) https://dart.googlesource.com/pub.git/+/52f2bdc2 Enable dependabot (#3340) https://dart.googlesource.com/pub.git/+/1e70c0c7 Remove `uploader` command (#3335) https://dart.googlesource.com/pub.git/+/3174a264 Warn if git version is not high enough for supporting all features (#3332) https://dart.googlesource.com/pub.git/+/3f7a3cb7 Don't analyze ignored directories in directory-validator (#3331) https://dart.googlesource.com/pub.git/+/e8f36614 Allow use of token for talking to pub.dev (#3330) https://dart.googlesource.com/pub.git/+/b93bf88f Upgrade `package:tar` to version `0.5.4`. (#3313) https://dart.googlesource.com/pub.git/+/fbc9732e Support for different versioning strategies in dependency_services (#3320) https://dart.googlesource.com/pub.git/+/93c7cfcd Update repository-spec-v2.md (#3311) https://dart.googlesource.com/pub.git/+/941191f7 dependency_services (#3304) https://dart.googlesource.com/pub.git/+/61175cb6 fix: relative to the current directory rules (#3297) https://dart.googlesource.com/pub.git/+/f27e90d3 Upgrade other versions conservatively with --major-versions (#3295) https://dart.googlesource.com/pub.git/+/a2461417 Add flag controlling creation of `.packages` file. (#2757) ``` Diff: https://dart.googlesource.com/pub.git/+/8f5ab7b1aba3b9f66b56246d77e167990339d317~..a3a102a549388a6dbfecc9252fabb618f9a2f5f7/ Change-Id: I8d0ea375039ea450d397871d9fac35d590ea8869 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/239315 Reviewed-by: Jonas Jensen <jonasfj@google.com> Commit-Queue: Sigurd Meldgaard <sigurdm@google.com>
Currently, a future created using Future.immediate() will complete synchronously. That means code consuming futures has to be aware that operations that it chains of a future it receives may in fact run synchronously or they may do bad things.
For a concrete example, the unittest API will fail spectacularly if what it thinks is an async test completes synchronously.
To keep the semantics simple for consumers of futures, I believe they should always complete asynchronously. This means Future.immediate() should pump the message queue before completing.
If we do make this change, we should probably change the name of the constructor too, since it's no longer "immediate". I would either just use an unnamed constructor, or possibly "of": new Future.of(someValue);
The text was updated successfully, but these errors were encountered: