Привет всемНекоторые пояснения Completer
У меня есть один класс «Пример», которому нужно сделать некоторые вычисления. Я вызываю start(), которые вызывают _next(). Во время вычисления _next() вызывает себя пару раз, но в моем примере я имитирую это с помощью таймера. Вот мой код
import "dart:async";
main() {
Example ex = new Example();
for (var i = 0 ; i < 3 ; i++) {
ex.start().then((nbr) {
print(nbr);
});
}
}
class Example {
/// for _next
Completer _insideCompleter;
/// from start() to outside
Completer _outsideCompleter;
Example();
/// start is just a better public api than next when we start the exercise
Future<int> start() {
_insideCompleter = new Completer();
_outsideCompleter = new Completer();
_next().then((int value) {
print("value: $value");
_outsideCompleter.complete(value);
}).catchError((message) {
print("information: $message");
});
return _outsideCompleter.future;
}
/// _next handle the flow with the status
Future<int> _next() {
new Timer(new Duration(seconds: 6),() {
_insideCompleter.complete(15);
});
return _insideCompleter.future;
}
}
она заканчивается: плохое состояние: Будущее уже завершено. но как вы можете видеть в начале(). Завершение воссоздается с новым. Поэтому я не понимаю, почему он уже завершен.
Если кто-нибудь может объяснить, почему это не правильно закодировать так, и, возможно, дать мне некоторые интересные ссылки, было бы здорово
Ура!
Hummm да я думаю, я получил его ... Я выполняю 3 раза start() _insideCompleter создается 3 раза, но каждый раз на одной и той же ссылке, что означает, что в конце есть только один экземпляр, который заканчивается в первый раз ... я прав? – BenNG
Yup, вот как это работает. Вы хотите, чтобы 'start' вызывался (почти) одновременно или должен был быть отложен следующий вызов до тех пор, пока предыдущий не был закончен? Вы можете использовать 'Future.doWhile()' для достижения этого. –
Я подумаю об этом на самом деле ... Я застрял ... Я никогда не использую Future.doWhile() Повод увидеть, как это работает :) – BenNG