2

以下の点について、お役に立てれば幸いです。いくつかのコンソール テスト プログラムを作成していますが、端末からいくつかのパラメーターを入力できるようにしたいと考えています (コマンド ライン引数を使用したくありません - パラメーターが多すぎます)。いくつかのバリエーションを試しましたが、これを達成する方法が見つかりません。以下は、端末入力のテストの最新バージョンです。このプログラムの問題は、エラーが発生した場合、Completer が自動的に終了することです。Main() または fGetNumber() 関数から続行したいのです。このプログラムが機能しない理由はわかりますが、何を達成する必要があるかを示しています。数値を再入力しますが、それを達成する方法が見つかりません。有効な数字が入力されていれば問題ありません。無効な番号が入力された場合、番号の再入力方法がわかりません。

コードは次のとおりです。私が抱えている問題は「//////////」で強調表示されています。

import "dart:async" as async;
import "dart:io";

void main() {
  fGetNumber("Enter Nr of Iterations : ", 0, 999999)
  .then((int iIters){   
    print ("In Main : Iterations selected = ${iIters}");
    if (iIters == null) {
      print ("In Main: Invalid Number of iterations : ${iIters}.");
    } else {
      fProcessData(iIters);
    }
    print ("Main Completed");       
  });
 }

async.Future<int> fGetNumber(String sPrompt, int iMin, int iMax) {
  print ("In fGetNumber");
  int iIters  = 0; 
  async.Completer<int> oCompleter = new async.Completer();

  while (!oCompleter.isCompleted) { ///////////   This loop does not work ///////  
    return fGetUserInput(sPrompt).then((String sIters) {
      iIters = int.parse(sIters);
      if (iIters < iMin || iIters > iMax) throw new Exception("Invalid");        
      oCompleter.complete(iIters);
      return oCompleter.future;
    }).catchError((_) => print ("Invalid - number must be from ${iMin} to ${iMax}")
    ).whenComplete(() => print ("fGetNumber - whenComplete"));// always gets here
  }
  print ("In fGetNumber (at end of function)");     //// it never gets here
}

async.Future<String>  fGetUserInput(String sPrompt) {
  print ("In fGetUserInput");
  async.Completer<String> oCompleter = new async.Completer(); 

  stdout.write(sPrompt);
  async.Stream<String> oStream = stdin.transform(new StringDecoder());
  async.StreamSubscription oSub;
  oSub = oStream.listen((String sData) {
    oCompleter.complete("$sData");
    oSub.cancel();
  });

  return oCompleter.future;
}

void fProcessData(int iIters) {
  print ("In fProcessData");
  for (int iPos = 1; iPos <= iIters; iPos++ ) {
    if (iPos%100 == 0) print ("Processed = ${iPos}");
  }
  print ("In fProcessData - completed ${iIters}");
} 
4

1 に答える 1