2

Dart を独学で学ぼうとしているのですが、C 出身で少し混乱しています...

私はこれをやっています:

import 'dart:io';
import 'dart:async';
import 'dart:convert';

Future <Map>    ft_get_data()
{
    File    data;

    data = new File("data.json");
    return data.exists().then((value) {
        if (!value)
        {
            print("Data does no exist...\nCreating file...");
            data.createSync();
            print("Filling it...");
            data.openWrite().write('{"index":{"content":"Helllo"}}');
            print("Operation finish");
        }
        return (1);
    }).then((value) {
        data.readAsString().then((content){
            return JSON.decode(content);
        }).catchError((e) {
            print("error");
            return (new Map());
        });
    });
}

void    main()
{
    HttpServer.bind('127.0.0.1', 8080).then((server) {
        print("Server is lauching... $server");
        server.listen((HttpRequest request) {
            request.response.statusCode = HttpStatus.ACCEPTED;
            ft_get_data().then((data_map) {
                if (data_map && data_map.isNotEmpty)
                    request.response.write(data_map['index']['content']);
                else
                    request.response.write('Not work');
            }).whenComplete(request.response.close);
        });
    }) .catchError((error) {
        print("An error : $error.");
    });
}

新しいマップを取り戻そうとしていますが、ご想像のとおり、機能せず、「機能しません」というメッセージが表示されます。コードが同じ機能にあるときは、うまくいきました...

助けてください。

そして、C としてポインタシステムがありますか?

void function(int *i)
{
    *i = 2;
}

int main()
{
    int i = 1;
    function(&i);
    printf("%d", i);
}
// Output is 2.

ご協力ありがとうございました。

最終コード:

import 'dart:io';
import 'dart:async';
import 'dart:convert';

Future<Map> ft_get_data()
{
    File    data;

    data = new File("data.json");
    return data.exists()
    .then((value) {
        if (!value) {
            print("Data does no exist...\nCreating file...");
            data.createSync();
            print("Filling it...");
            data.openWrite().write('{"index":{"content":"Helllo"}}');
            print("Operation finish");
        }
    })
    .then((_) => data.readAsString())
    .then((content) => JSON.decode(content))
    .catchError((e) => new Map());
}

void        main()
{
    HttpServer.bind('127.0.0.1', 8080)
    .then((server) {
        print("Server is lauching... $server");
        server.listen((HttpRequest request) {
            request.response.statusCode = HttpStatus.ACCEPTED;
            ft_get_data()
            .then((data_map) {
                if (data_map.isNotEmpty)
                    request.response.write(data_map['index']['content']);
                else
                    request.response.write('Not work');
            })
            .whenComplete(request.response.close);
        });
    })
    .catchError((error) {
        print("An error : $error.");
    });
}
4

3 に答える 3

1

then() をもう一方に挿入することはできません。それらを連鎖させる必要があります。それ以外の場合は、前の「then」ハンドラの代わりに JSON.decode(data) がどこにも戻りません (メイン イベント ループ)

于 2014-03-23T03:39:28.410 に答える
1

コードを「読み取り可能な」形式に再構築しようとしました。検証はしていませんので、誤差があるかもしれません。.then()私にとって、ネストされていない場合、コードははるかに読みやすくなります。.then()また、新しい行を開始すると、読みやすくなります。

import 'dart:io';
import 'dart:async';
import 'dart:convert';

Future <Map>ft_get_data()
{
    File data;

    data = new File("data.json");
    data.exists() //returns true or false
    .then((value) { // value is true or false
        if (!value) {
            print("Data does no exist...\nCreating file...");
            data.createSync();
            print("Filling it...");
            data.openWrite().write('{"index":{"content":"Helllo"}}');
            print("Operation finish");
        }
    }) // this doesn't need to return anything
    .then((_) => data.readAsString()) // '_' indicates that there is no input value, returns a string. This line can removed if you add return data.readAsString(); to the last line of previous function.
    .then((content) => JSON.decode(content)); // returns decoded string, this is the output of ft_get_data()-function
//    .catchError((e) { //I believe that these errors will show in main-function's error
//      print("error");
//    });
}

void    main()
{
    HttpServer.bind('127.0.0.1', 8080)
    .then((server) {
        print("Server is lauching... $server");
        server.listen((HttpRequest request) {
            request.response.statusCode = HttpStatus.ACCEPTED;
            ft_get_data()
            .then((data_map) {
                if (data_map && data_map.isNotEmpty)
                    request.response.write(data_map['index']['content']);
                else
                    request.response.write('Not work');
            })
            .whenComplete(request.response.close);
        });
    }) 
    .catchError((error) {
        print("An error : $error.");
    });
}
于 2014-03-23T06:42:47.400 に答える
1

簡単に見た後、私はあなたが必要だと言うでしょう

Future<Map> ft_get_data() {
  ...
  return data.exists() ...
  ...
}

そしてそれを次のように使用します

server.listen((HttpRequest request) {
  request.response.statusCode = HttpStatus.ACCEPTED;
  ft_get_data().then((data_map) {
    if (data_map && data_map.isNotEmpty) request.response.write(
        data_map['index']['content']); 
    else 
        request.response.write('Not work');
    request.response.close();
  });
});

a のreturn中の aは、からではなく、からのみthen返され ます。非同期呼び出しが関係している場合、それが同期だった場合は続行できません。その後、ずっと非同期になります。ft_get_datathen

于 2014-03-22T17:34:53.360 に答える