

※最初の投稿では認識間違いがあったので修正です

以下のようなコードがあって、asyncが付いているメソッドからは`data = await
readData()`と書けば待ってくれるのですが、そうでないメソッドだとawaitは使えないとエラーが出ます。  
どうしたらasyncが付いてないメソッドでも使えるようにできるでしょう？

[code]

    class FileTools{
      Future<Map<String, List<String>>> readData() async {
        if(_file==null) setFile();
    
        try {
          String data = await _file.readAsString();
          return json.decode(data);
        } catch (e) {
          // If encountering an error, return 0.
          return null;
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2021-02-25T22:20:32.837
74281
2023-06-18T22:07:25.847
2021-02-26T05:10:37.087
816
816
question
非同期 flutter dart
Dartでawaitをasyncが付いてないメソッドで使えない


質問を, ある別の 非同期でない処理の中から, 非同期メソッド `readData()` を呼び出す方法, と判断します

非同期処理は, いくつかのプログラミング言語で `async`/`await` のワードで扱えるようになっています。が, `await`
は非同期関数から非同期関数を呼び出す際に用いられ, 通常の関数から呼び出すことは(そのままでは)できません。(`await`なしで呼び出せるが
callbackを受け取れない, など, 言語によって違いがある)

Dartや JavaScriptでは, `async`/`await` 導入以前に非同期処理の機能が存在し, それを利用することが可能。  
Dartでの非同期処理は `future` と呼ばれるようです。それを使うには

  1. `async` と `await` を使う方法
  2. `Future` (クラス)の APIを使う方法

後者の `Future` API では, 非同期処理完了の callback 受け付け(？)に `then()`メソッドを指定

[code]

    final future = a_method()
    future.then((val) => print(val))
    
[/code]

また, Dartの `Future` APIは, JavaScriptでの `Promise` がそれに当たるので参考にできるかもしれません  
【参考】  
<https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises>

[code]

    doSomething()
    .then(result => doSomethingElse(result))
    .then(newResult => doThirdThing(newResult))
    .then(finalResult => {
      console.log(`Got the final result: ${finalResult}`);
    })
    .catch(failureCallback);
    
[/code]


CC BY-SA 4.0
2021-03-02T04:44:15.130
74354
2021-03-02T04:44:15.130
43025
74281
answer