Since I started to use async/await, my life have become hell. Here is some the few reason why:
dart:core-patch/object_patch.dart 42 Object._noSuchMethod
dart:core-patch/object_patch.dart 45 Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
--
For other discussions, see https://groups.google.com/a/dartlang.org/
For HOWTO questions, visit http://stackoverflow.com/tags/dart
To file a bug report or feature request, go to http://www.dartbug.com/new
To unsubscribe from this group and stop receiving emails from it, send an email to misc+uns...@dartlang.org.
Since I started to use async/await, my life have become hell. Here is some the few reason why:
- Get a lot of unknown error (https://github.com/dart-lang/async_await/issues/84) :
dart:core-patch/object_patch.dart 42 Object._noSuchMethod
dart:core-patch/object_patch.dart 45 Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
- As soon as you add one await somewhere, your whole program transform in a await/async hell/mess where you have to add them to almost all of your function, because I'm trying to use indexeddb, so every time you want to access your data, it's a "await".- If you want to use IndexedDb, you don't have much choose then to use async/await.
- Sometime, just marking some function async make the compiler throwing the towel and give crazy number of error. You have to change the error of function, split function, change variable name, etc.. to eventually get your code working...- You make unittest program to test your website? all of your function start with an await
So, I got one suggestion, if you think about starting to use await/async, don't do it.
If you don't like asynchrony in general, I agree with you. Unfortunately, the world's JS engines don't. Since we have to compile to JS, our hands our tied on what kinds of concurrency primitives Dart can implement.
I tried async/await then backed away when dart2js threw it hands up. When it's is ready I will try again, although I pretty much am totally used to the future model at this point. The one improvement I'd like to see is better debugging so that a stack trace is somehow preserved across events (trace back to the origin of the completion). Maybe async/await will bring that or something similar? If so then I'd consider that large benefit.
Much of my async codes ends up as lists of simple functions, typically inner, that I execute using a small utility called "execAsyncOps". I find this easy to understand and tidier than the future.then().then().then() pattern. Especially, of course, when the list of operations becomes long.
Future doSomethingAsync() {
step_one(_) => do something;
step_two(_) => do next thing;
step_three(var resultOfStepTwo) => do some with resultOfStepTwo;
step_four_final(_) => return finalValue;
return execAsyncOps([step_one, step_two, step_three, step_four]);
}
typedef Future AsyncOp(var arg);
/**
* Execute a list of chained async operations in order. Return the
* future result of the last operation.
*/
Future execAsyncOps(List<AsyncOp> ops, {var firstOpParam : null}) {
// If empty ops list then return a noop future.
if (ops.length == 0) {
return new Future.sync(() {});
}
// Initialize by executing the first operation and making it into a future
// if it is not already.
if (!(nextFuture is Future)) {
var nextFuture = ops[0](firstOpParam);
if (!(nextFuture is Future)) {
nextFuture = new Future.value(nextFuture);
}
// Iterate over the remaining futures in the list.
if (ops.length > 1) {
ops.sublist(1).forEach( (op) => nextFuture = nextFuture.then(op) );
}
// Return the last future value (the value returned by the last operation).
return nextFuture;
}
stackTrace(void test()) {
Chain.capture(() => test(), onError: (error, stack) {
_log.shout(error);
_log.info(stack.terse);
});
}
void main() {
initLogging();
group('lib', () {
test('basic', () => stackTrace(() {
return new Future(() => someFunc());
}));
});
}
someFunc() => new Future(()=> someOtherFunc());
someOtherFunc() => new Future(() => expect(false, isTrue));
On Mar 21, 2015 4:33 AM, "Jim Trainor" <jim.train...@gmail.com> wrote:
>
> I tried async/await then backed away when dart2js threw it hands up. When it's is ready I will try again, although I pretty much am totally used to the future model at this point.
The model is exactly the same though. async/await is based on Futures.
>>> It's have been since async/await have been available that I started to use them which is now almost three month and those problem didn't go away, not even with the latest 1.9.0-dev.10.10 (rev 44550).
>>>
>>> So, I got one suggestion, if you think about starting to use await/async, don't do it.
>
testForEach() {
var steps = [
() => someAsync(1),
() => someAsync(2),
() => someAsync(3),
() => someAsync(4)
];
Future.forEach(steps, (x) => x());
}
var rnd = new Random();
someAsync(int i) => new Future.delayed(
new Duration(milliseconds: rnd.nextInt(200)), () => print(i));
If you don't like asynchrony in general, I agree with you. Unfortunately, the world's JS engines don't. Since we have to compile to JS, our hands our tied on what kinds of concurrency primitives Dart can implement.Curious as to what other kinds of concurrency primitives there are, and why you don't like asynchrony. Would like to learn more, and perhaps you can share some links...
void getItemResourceSummary(int userid, String itemgroupid, int itemid, String profile, String lang, jsb.JsCallback callback) {
irs.ItemResource fetchedItemResource;
drs.DictResource fetchedDictResource;
dprs.DictPrefResource fetchedDictPrefResource;
_1_fetchItem(_) => _itemResourceService.get(new irs.ItemLocator(userid, itemgroupid, itemid, lang));
_2_receiveItem(irs.ItemResource resource) => fetchedItemResource = resource;
_3_fetchDict(_) => _dictResourceService.get(new drs.DictLocator(fetchedItemResource.queryResult.dictid, lang));
_4_receiveDict(drs.DictResource resource) => fetchedDictResource = resource;
_5_fetchDictPref(_) => _dictPrefResourceService.get(new dprs.DictPrefLocator(fetchedItemResource.queryResult.dictid, profile, lang));
_6_receiveDictPref(dprs.DictPrefResource dictPrefResource) => fetchedDictPrefResource = dictPrefResource;
_7_makeSummary(_) => new wbm_bldr.JsonItem.fromResources(fetchedDictResource.queryResult, fetchedDictPrefResource.queryResult, fetchedItemResource.queryResult);
_8_executeCallback(wbm_bldr.JsonItem summary) => callback([summary]);
more_async.execAsyncOps(
[_1_fetchItem, _2_receiveItem, _3_fetchDict, _4_receiveDict, _5_fetchDictPref, _6_receiveDictPref, _7_makeSummary, _8_executeCallback]
);
}
--
--
--
We're going to split Quiver up at some point soon to address this issue. The individual libraries in Quiver are adjust very focused though.
In the mean time Quiver is very actively maintained, has great test coverage, and is used extensively within Google. I'd personally say it's a good choice :)
I just can't agree that this is a problem. The benefit of a great package system, logical core interfaces, and a smart community, is that in most cases you don't need to rely on any one gate keeper to add useful functionality.
Word "chain" (or "serial", if you will, especially if paired with "parallel") is important IMO. And it's not there. Neither in Future, nor in quiver.
--
On Mar 21, 2015 4:33 AM, "Jim Trainor" <jim.train...@gmail.com> wrote:
>
> I tried async/await then backed away when dart2js threw it hands up. When it's is ready I will try again, although I pretty much am totally used to the future model at this point.
The model is exactly the same though. async/await is based on Futures.
On Fri, Mar 20, 2015 at 1:48 AM, Rat Jo <jora...@gmail.com> wrote:Since I started to use async/await, my life have become hell. Here is some the few reason why:
- Get a lot of unknown error (https://github.com/dart-lang/async_await/issues/84) :
dart:core-patch/object_patch.dart 42 Object._noSuchMethod
dart:core-patch/object_patch.dart 45 Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
This is a bug in the async_await compiler.
Since I started to use async/await, my life have become hell. Here is some the few reason why:
- Get a lot of unknown error (https://github.com/dart-lang/async_await/issues/84) :
dart:core-patch/object_patch.dart 42 Object._noSuchMethod
dart:core-patch/object_patch.dart 45 Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
- As soon as you add one await somewhere, your whole program transform in a await/async hell/mess where you have to add them to almost all of your function, because I'm trying to use indexeddb, so every time you want to access your data, it's a "await".- If you want to use IndexedDb, you don't have much choose then to use async/await.- Sometime, just marking some function async make the compiler throwing the towel and give crazy number of error. You have to change the error of function, split function, change variable name, etc.. to eventually get your code working...- You make unittest program to test your website? all of your function start with an awaitIt's have been since async/await have been available that I started to use them which is now almost three month and those problem didn't go away, not even with the latest 1.9.0-dev.10.10 (rev 44550).So, I got one suggestion, if you think about starting to use await/async, don't do it.
Bob's post is exactly the kind of education I was looking for. Very enlightening (and entertaining)! Thank you.
I agree, all these async stack frames are useless noise if you're not actually debugging how futures and zones work which I usually don't do.You can create a helper to wrap each tests code with Chain capture.
stackTrace(void test()) {
Chain.capture(() => test(), onError: (error, stack) {
_log.shout(error);
_log.info(stack.terse);
});
}
void main() {
initLogging();
group('lib', () {
test('basic', () => stackTrace(() {
return new Future(() => someFunc());
}));
});
}
someFunc() => new Future(()=> someOtherFunc());
someOtherFunc() => new Future(() => expect(false, isTrue));but maybe there are better ways.
On Saturday, March 21, 2015 at 5:17:25 PM UTC+1, Jim Trainor wrote:No I haven't used stack_trace. I'll likely add it to my top level exception handler for error capture and reporting in the deployed application. Should be natively supported by the dart debugger. When I'm debugging an errant exception I am normally in a unit test. The unit test package implements the top level exception handler and it doesn't report a full stack trace when an expect(...) fails. Maybe that's a place to integrate stack_trace.... or maybe I need to go look at my tests and understand better how it might be employed.Need it in the debugger but default to be most useful.
On Saturday, March 21, 2015 at 8:01:14 AM UTC-4, Günter Zöchbauer wrote:Do you use the stack_trace package?While it's around for a long time I didn't stumble upon it until very recently- http://stackoverflow.com/questions/29013591/how-to-get-the-full-stack-trace-for-async-execution
Would be great to have this stack trace available in the debugger as well.
var surface = length_odd_wall * length_even_wall;
var volume = surface * height;
var nbre_equip1 = surface / 4;
var nbre_equip2 = surface / 2;
var nbre_equip3 = surface * 4;
var nbre_equip4 = volume;
var nbre_equip5 = 7;
var nbre_equip6 = (await equip_type_index.getByIndex('variable_name', 'equip6'))['default_qty'];
var cost_equip1 = nbre_equip1 * (await equip_type_index.getByIndex('variable_name', 'equip1'))['selling'];
var cost_equip2 = nbre_equip2 * (await equip_type_index.getByIndex('variable_name', 'equip2'))['selling'];
var cost_equip1_2 = (cost_equip1 + cost_equip2) * (await configuration_index.getByIndex('variable_name', 'factor1'))['value'];
var cost_equip3 = nbre_equip3 * (await equip_type_index.getByIndex('variable_name', 'equip3'))['selling'];
var cost_equip4 = nbre_equip4 * (await equip_type_index.getByIndex('variable_name', 'equip4'))['selling'];
var cost_equip5 = nbre_equip5 * (await equip_type_index.getByIndex('variable_name', 'equip5'))['selling'];
var cost_equip6 = nbre_equip6 * (await equip_type_index.getByIndex('variable_name', 'equip6'))['selling'];
var cost_equip3_4_5_6 = (cost_equip3 + cost_equip4 + cost_equip5 + cost_equip6) * (await configuration_index.getByIndex('variable_name', 'factor2'))['value'];
var sub_total_cost = cost_equip1_2 * cost_equip3_4_5_6;
var tax1 = sub_total_cost * (await configuration_index.getByIndex('variable_name', 'tax1'))['value'];
var tax2 = sub_total_cost * (await configuration_index.getByIndex('variable_name', 'tax2'))['value'];
var total_cost = sub_total_cost + tax1 + tax2;
Map getByIndex(String index, dynamic value) async {
var transaction = _db.transaction(storageName, 'readonly');
var objectStore = transaction.objectStore(storageName);
return await objectStore.index('${index}_index').get([value, 1]);
}
void _socketIoEmit_Callback(js.JsObject js_socket, js.JsObject b) async {
.
.
.
}
Quote from Bob: This is a bug in the async_await compiler. Note that this is unrelated to the native implementations of async/await in the VM and dart2js. That compiler exists mainly as a temporary way to let us experiment with using async/await in Dart code before any native implementations of it existed.
If you're on the latest dev builds of the SDK, I encourage you to stop using the async_await compiler and just use the VM's and dart2js's native implementations of it. I'm not promising that they're bug-free either, but they are getting a lot more love and attention than the compiler is.
Quote from Jim Trainor: ... I know also that I've had to tweak mine over time to property deal with indexed_db interactions (indexed_db closes the transaction when you leave the event loop without an db operation outstanding. It's easy to do by accident so one must be careful. Further the behaviour varies between browsers so it's nice stay in control...).
Also, in the first code, I'm supposed to eventually allow people to change formula. At first I though that I will call eval from js, but all those await are throwing me off... Anyway, that's an another story.So, by having code like that, it break the code at multiple place and pause the execution causing delay and problem with the data. I now lock my database, but before I added a lock, I could receive data from the network which will update the data and cause weird behavior in my computation.Now, the other thing. "Having a super async interface". I know how to do it. The problem is that you can't know when it's gonna be finish. Well, I just thought that I could probably save all future in an array and wait for them... The thing is it's easy to display something on the screen in an async way, but I'm also generating html code that I send to a server to create a pdf using wkhtmltopdf. So I need to be able to know at when it's done.
Kevin Millikin, the error that I put there is only part of it and it's a 200+ lines error. It's indeed not the same error as of issue 84 on github. It happened when a decided to transform a function by only adding "async" keyword to it. Nothing else. No await, no additionnal code, nothing. Just the keyword, but I could not isolate the error in simple program.
void _socketIoEmit_Callback(js.JsObject js_socket, js.JsObject b) async {
.
.
.
}
Quote from Bob: This is a bug in the async_await compiler. Note that this is unrelated to the native implementations of async/await in the VM and dart2js. That compiler exists mainly as a temporary way to let us experiment with using async/await in Dart code before any native implementations of it existed.
If you're on the latest dev builds of the SDK, I encourage you to stop using the async_await compiler and just use the VM's and dart2js's native implementations of it. I'm not promising that they're bug-free either, but they are getting a lot more love and attention than the compiler is.Bob, I use Dart for two reason: It compile to javascript and it help me code faster because of the job the editor is doing such as code completion. I have no interest in using the VM at this time, nor does my client. Also, Dart VM still does not support Js on the server side. You would kick the VM out and I would still be an happy man. The VM is great for test and debugging. but it's totally useless for me if it doesn't compile to Js. You will probably tell me that it's not finish... but it look pretty finish to me...
Quote from Jim Trainor: ... I know also that I've had to tweak mine over time to property deal with indexed_db interactions (indexed_db closes the transaction when you leave the event loop without an db operation outstanding. It's easy to do by accident so one must be careful. Further the behaviour varies between browsers so it's nice stay in control...).Jim, thanks for your comment, as of right now, IndexedDb does not give me any problem in itself. It's just the async nature of it that force me to make all my code async and it's messing with everything. I never close them, but I always open a new objectStore when I need them, since that moment, I never had problem with it anymore and I have a lot of data and table.Günter Zöchbauer, my unittest is using a custom test function as the default test function that was coming with the unittest package whould not support await in a way that was good for me. It call the test function without executing it. So, if you do stuff before or after the test function, it mess your logic. I mint have to still take a look at how you did them inside Dart...
My real point is that there shouldn't be any async keyword and all the await done automatically. This way, I would not need to write two function everytime there is a possibility that I need both. I think the new generator keyword yield in ES6 will solve a lot of those problem. And I think it actually make it in a way that you don't need to add anything to other function that is calling the function that contain a yield which should be the default behavior.
Kevin Millikin, the error that I put there is only part of it and it's a 200+ lines error. It's indeed not the same error as of issue 84 on github. It happened when a decided to transform a function by only adding "async" keyword to it. Nothing else. No await, no additionnal code, nothing. Just the keyword, but I could not isolate the error in simple program.
void _socketIoEmit_Callback(js.JsObject js_socket, js.JsObject b) async {
.
.
.
}
A couple of additional about indexed_db issues worth noting:
1) Completer.sync: The only circumstance where I *had* to use Completer.sync() was with indexed_db. Use it in cases where you've wrapped the db call, which itself returns a future whose completion you need to propagate using your own future (provided by Completer.sync(). If you use a regular Completer you will *leave the event loop* and the transaction will close before you start the next operation. Without experimenting I'm not sure how to express that using async/await.
2) Multiple cursors: This is another case where I accidentally left the event loop and encountered errors and the behaviour was browser dependant. Initially I serialized my cursors. i.e. run the first to completion, then the second, then the third. That was fine in chrome, didn't work in others. The solution was to start all cursors at the same time and then perform a parallel wait (i.e. Future.wait()).
3) Browser capabilities: Here are the things you need to be concerned about insofar as cross browser support is considered: i) multi-store transactions, ii) array as key, iii) dot notation key access, iv) compound index keys, v) in-cursor delete, v) clean exception propagation (some indexed_db exceptions escape the dart zone error handler, on firefox I recall - need file a bug on that). This demonstrates most of the limitations, not all: http://codepen.io/cemerick/pen/Itymi
If you depend on any of those then you need to find work-arounds. Safari's brand new indexed_db implementation is incredibly slow. Doesn't work at all in iOS webkit yet. I have wrapped my indexed_db code in a private interface as an escape hatch in case I need(ed) to provide an alternate solutions. It's not looking like alternates will be necessary as long as webkit gets indexed_db support in the near future. If not then plan b is to implement my private interface using web-sql which is available in webkit.
Personally, there is enough going on here that I wouldn't want to add the additional complication of async/await keywords without nearly perfect knowledge of how those are translated into futures and completions.
Quote from Bob: This is a bug in the async_await compiler. Note that this is unrelated to the native implementations of async/await in the VM and dart2js. That compiler exists mainly as a temporary way to let us experiment with using async/await in Dart code before any native implementations of it existed.
If you're on the latest dev builds of the SDK, I encourage you to stop using the async_await compiler and just use the VM's and dart2js's native implementations of it. I'm not promising that they're bug-free either, but they are getting a lot more love and attention than the compiler is.Bob, I use Dart for two reason: It compile to javascript and it help me code faster because of the job the editor is doing such as code completion. I have no interest in using the VM at this time, nor does my client. Also, Dart VM still does not support Js on the server side. You would kick the VM out and I would still be an happy man. The VM is great for test and debugging. but it's totally useless for me if it doesn't compile to Js. You will probably tell me that it's not finish... but it look pretty finish to me...Dart2js has async/await integrated as well. No need for the transformer AFAIK
+1000 for Alex
I hope this doesn't just get ignored, and we continue to have naming that forces us to memorize, due to lack of correlation.
On Monday, March 23, 2015 at 2:00:35 AM UTC+2, Alex Tatumizer wrote:Justin: it seems we (you and me) belong to different schools of philosophical thought. That's fine. There are many schools, one can choose, mix and match.I think that the goal of library is, first and foremost, to introduce a vocabulary to facilitate thinking. And only as a consequence, help writing code by providing building blocks that correspond to the words of this vocabulary.Word "chain" (or "serial", if you will, especially if paired with "parallel") is important IMO. And it's not there. Neither in Future, nor in quiver. Sure, you can express it via "reduce", or via then(), or in million other ways. But that's not the point. Following the logic "you can express x via y" I can prove that you don't need cos(x) because it's sin(x+PI/2), you don't need string addition because you can use "$x$y", you don't need x-y because it's the same as x+(-y), and you don't need... basically anything except 3 instructions that define minimal Turing-complete machine.Again, this is not something that you necessarily have to agree with. Just wanted to be sure I expressed the point clearly.
--
Typo: not "chain", but "serial", sorry
--
When you write> As a code reader, I'd rather see this than something like chain(null, [f1, f2]) because it's more plain and explicit.Again, 2 different schools of thought :-)
I confess that the very thought of compiler making forshmak out of my code whenever I write "await" makes me sick.var r1 = f1();var r2 = f2(r1);- that's exactly what you get.with await, it's not what you get. You get something completely different.
"await" goes very much beyond normal syntax sugar. It's quite complicated transformation of code.
I know counter-arguments, of course. Still, I'd prefer to keep closer to the metal
, especially if library provided more convenient primitives. Both ways are evil, but what is the lesser evil? it is not quite obvious.
On Mar 24, 2015 10:35 PM, "Cristian Garcia" <cgarc...@gmail.com> wrote:
> Just don't use async/await in the browser, I had a bunch of problems with the dart2js transformer, better wait till its officially supported.
It is officially supported in v1.9, without a transformer.
/L
NoSuchMethodError: method not found: 'lexeme'
Receiver: null
Arguments: []
dart:core-patch/object_patch.dart 42 Object._noSuchMethod
dart:core-patch/object_patch.dart 45 Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1936 AsyncTransformer.visitBooleanLiteral.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692 AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696 AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 1161 AsyncTransformer.visitIfStatement.<fn>.<fn>
package:async_await/src/xform.dart 1788 AsyncTransformer.visitBinaryExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1798 AsyncTransformer.visitBinaryExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1797 AsyncTransformer.visitBinaryExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1793 AsyncTransformer.visitBinaryExpression.<fn>
package:async_await/src/xform.dart 1787 AsyncTransformer.visitBinaryExpression.<fn>.<fn>
package:async_await/src/xform.dart 1798 AsyncTransformer.visitBinaryExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1944 AsyncTransformer.visitIntegerLiteral.<fn>
package:async_await/src/xform.dart 1797 AsyncTransformer.visitBinaryExpression.<fn>.<fn>
package:async_await/src/xform.dart 2077 AsyncTransformer.visitPropertyAccess.<fn>.<fn>
package:async_await/src/xform.dart 1876 AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 2076 AsyncTransformer.visitPropertyAccess.<fn>
package:async_await/src/xform.dart 1793 AsyncTransformer.visitBinaryExpression.<fn>
package:async_await/src/xform.dart 1786 AsyncTransformer.visitBinaryExpression.<fn>
package:async_await/src/xform.dart 1151 AsyncTransformer.visitIfStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1556 AsyncTransformer.visitWhileStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 2077 AsyncTransformer.visitPropertyAccess.<fn>.<fn>
package:async_await/src/xform.dart 2077 AsyncTransformer.visitPropertyAccess.<fn>.<fn>
package:async_await/src/xform.dart 1876 AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 2076 AsyncTransformer.visitPropertyAccess.<fn>
package:async_await/src/xform.dart 2076 AsyncTransformer.visitPropertyAccess.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692 AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696 AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 829 AsyncTransformer.visitExpressionStatement.<fn>.<fn>
package:async_await/src/xform.dart 2040 AsyncTransformer.visitMethodInvocation.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1898 AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1917 AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2038 AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1885 AsyncTransformer.visitIndexExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1884 AsyncTransformer.visitIndexExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1880 AsyncTransformer.visitIndexExpression.<fn>
package:async_await/src/xform.dart 2034 AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 827 AsyncTransformer.visitExpressionStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1062 AsyncTransformer.visitForStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1885 AsyncTransformer.visitIndexExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1975 AsyncTransformer.visitSimpleStringLiteral.<fn>
package:async_await/src/xform.dart 1884 AsyncTransformer.visitIndexExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1880 AsyncTransformer.visitIndexExpression.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 829 AsyncTransformer.visitExpressionStatement.<fn>.<fn>
package:async_await/src/xform.dart 2046 AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1898 AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1999 AsyncTransformer.visitStringInterpolation.<fn>.<fn>
package:async_await/src/xform.dart 1898 AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1917 AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 1987 AsyncTransformer.visitStringInterpolation.<fn>
package:async_await/src/xform.dart 1917 AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2045 AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 827 AsyncTransformer.visitExpressionStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1885 AsyncTransformer.visitIndexExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1975 AsyncTransformer.visitSimpleStringLiteral.<fn>
package:async_await/src/xform.dart 1884 AsyncTransformer.visitIndexExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1880 AsyncTransformer.visitIndexExpression.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692 AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696 AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 636 AsyncTransformer.visitBlockFunctionBody
package:analyzer/src/generated/ast.dart 2902 BlockFunctionBody.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
package:async_await/src/compiler.dart 45 compile
package:async_await/async_await.dart 10 compile
package:async_await/transformer.dart 25 AsyncAwaitTransformer.apply.<fn>
dart:async/zone.dart 1155 _RootZone.runUnary
dart:async/future_impl.dart 484 _Future._propagateToListeners.handleValueCallback
dart:async/future_impl.dart 567 _Future._propagateToListeners
dart:async/future_impl.dart 358 _Future._completeWithValue
dart:async/future_impl.dart 412 _Future._asyncComplete.<fn>
dart:async/schedule_microtask.dart 41 _asyncRunCallbackLoop
dart:async/schedule_microtask.dart 48 _asyncRunCallback
dart:isolate-patch/isolate_patch.dart 96 _runPendingImmediateCallback
dart:isolate-patch/isolate_patch.dart 143 _RawReceivePortImpl._handleMessage
dart:core Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1936 AsyncTransformer.visitBooleanLiteral.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692 AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696 AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 1161 AsyncTransformer.visitIfStatement.<fn>.<fn>
package:async_await/src/xform.dart 1788 AsyncTransformer.visitBinaryExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1798 AsyncTransformer.visitBinaryExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1797 AsyncTransformer.visitBinaryExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1793 AsyncTransformer.visitBinaryExpression.<fn>
package:async_await/src/xform.dart 1787 AsyncTransformer.visitBinaryExpression.<fn>.<fn>
package:async_await/src/xform.dart 1798 AsyncTransformer.visitBinaryExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1944 AsyncTransformer.visitIntegerLiteral.<fn>
package:async_await/src/xform.dart 1797 AsyncTransformer.visitBinaryExpression.<fn>.<fn>
package:async_await/src/xform.dart 2077 AsyncTransformer.visitPropertyAccess.<fn>.<fn>
package:async_await/src/xform.dart 1876 AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 2076 AsyncTransformer.visitPropertyAccess.<fn>
package:async_await/src/xform.dart 1793 AsyncTransformer.visitBinaryExpression.<fn>
package:async_await/src/xform.dart 1786 AsyncTransformer.visitBinaryExpression.<fn>
package:async_await/src/xform.dart 1151 AsyncTransformer.visitIfStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1556 AsyncTransformer.visitWhileStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 2077 AsyncTransformer.visitPropertyAccess.<fn>.<fn>
package:async_await/src/xform.dart 2077 AsyncTransformer.visitPropertyAccess.<fn>.<fn>
package:async_await/src/xform.dart 1876 AsyncTransformer.visitPrefixedIdentifier.<fn>
package:async_await/src/xform.dart 2076 AsyncTransformer.visitPropertyAccess.<fn>
package:async_await/src/xform.dart 2076 AsyncTransformer.visitPropertyAccess.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692 AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696 AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 829 AsyncTransformer.visitExpressionStatement.<fn>.<fn>
package:async_await/src/xform.dart 2040 AsyncTransformer.visitMethodInvocation.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1898 AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1917 AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2038 AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1885 AsyncTransformer.visitIndexExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1884 AsyncTransformer.visitIndexExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1880 AsyncTransformer.visitIndexExpression.<fn>
package:async_await/src/xform.dart 2034 AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 827 AsyncTransformer.visitExpressionStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1062 AsyncTransformer.visitForStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1885 AsyncTransformer.visitIndexExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1975 AsyncTransformer.visitSimpleStringLiteral.<fn>
package:async_await/src/xform.dart 1884 AsyncTransformer.visitIndexExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1880 AsyncTransformer.visitIndexExpression.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 829 AsyncTransformer.visitExpressionStatement.<fn>.<fn>
package:async_await/src/xform.dart 2046 AsyncTransformer.visitMethodInvocation.<fn>.<fn>
package:async_await/src/xform.dart 1898 AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1999 AsyncTransformer.visitStringInterpolation.<fn>.<fn>
package:async_await/src/xform.dart 1898 AsyncTransformer._translateExpressionList.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1917 AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 1987 AsyncTransformer.visitStringInterpolation.<fn>
package:async_await/src/xform.dart 1917 AsyncTransformer._translateExpressionList
package:async_await/src/xform.dart 2045 AsyncTransformer.visitMethodInvocation.<fn>
package:async_await/src/xform.dart 827 AsyncTransformer.visitExpressionStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 1530 AsyncTransformer.visitVariableDeclarationStatement.<fn>.<fn>
package:async_await/src/xform.dart 1496 AsyncTransformer._translateDeclarationList.<fn>
package:async_await/src/xform.dart 1487 AsyncTransformer._translateDeclarationList.translateDecl.<fn>
package:async_await/src/xform.dart 1885 AsyncTransformer.visitIndexExpression.<fn>.<fn>.<fn>
package:async_await/src/xform.dart 1975 AsyncTransformer.visitSimpleStringLiteral.<fn>
package:async_await/src/xform.dart 1884 AsyncTransformer.visitIndexExpression.<fn>.<fn>
package:async_await/src/xform.dart 1872 AsyncTransformer.visitSimpleIdentifier.<fn>
package:async_await/src/xform.dart 1880 AsyncTransformer.visitIndexExpression.<fn>
package:async_await/src/xform.dart 1486 AsyncTransformer._translateDeclarationList.translateDecl
package:async_await/src/xform.dart 1511 AsyncTransformer._translateDeclarationList
package:async_await/src/xform.dart 1527 AsyncTransformer.visitVariableDeclarationStatement.<fn>
package:async_await/src/xform.dart 690 AsyncTransformer._translateStatementList.<fn>
package:async_await/src/xform.dart 692 AsyncTransformer._translateStatementList
package:async_await/src/xform.dart 696 AsyncTransformer.visitBlock.<fn>
package:async_await/src/xform.dart 636 AsyncTransformer.visitBlockFunctionBody
package:analyzer/src/generated/ast.dart 2902 BlockFunctionBody.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
package:async_await/src/compiler.dart 45 compile
package:async_await/async_await.dart 10 compile
package:async_await/transformer.dart 25 AsyncAwaitTransformer.apply.<fn>
dart:isolate _RawReceivePortImpl._handleMessage
[Info from Dart2JS]:
Compiling Assek|web/assek.dart...
ᐧ
Id take the comonadic await over the monadic then on all circumstances. It just much simpler to pretend you are getting an actual value out of a function than getting it through a callback. A more generalized version of this is Haskell's do-notation: takes the pain from having to repeat >==/fmap on all monadic operations as you currently do with then.
--
Since I started to use async/await, my life have become hell. Here is some the few reason why:
- Get a lot of unknown error (https://github.com/dart-lang/async_await/issues/84) :
dart:core-patch/object_patch.dart 42 Object._noSuchMethod
dart:core-patch/object_patch.dart 45 Object.noSuchMethod
package:async_await/src/xform.dart 854 AsyncTransformer._translateSynchronousForEach
package:async_await/src/xform.dart 892 AsyncTransformer.visitForEachStatement
package:analyzer/src/generated/ast.dart 7003 ForEachStatement.accept
package:async_await/src/xform.dart 490 AsyncTransformer.visit
- As soon as you add one await somewhere, your whole program transform in a await/async hell/mess where you have to add them to almost all of your function, because I'm trying to use indexeddb, so every time you want to access your data, it's a "await".
- If you want to use IndexedDb, you don't have much choose then to use async/await.- Sometime, just marking some function async make the compiler throwing the towel and give crazy number of error. You have to change the error of function, split function, change variable name, etc.. to eventually get your code working...- You make unittest program to test your website? all of your function start with an awaitIt's have been since async/await have been available that I started to use them which is now almost three month and those problem didn't go away, not even with the latest 1.9.0-dev.10.10 (rev 44550).So, I got one suggestion, if you think about starting to use await/async, don't do it.
--