2014-04-30 25 views
0

我已經試着去理解API文檔,關於他們的文章,這篇文章:How do you create a Stream in Dart如何使我自己的流

我使用的WebSocket製作一個簡單的Web應用程序。其實,它運行良好,但我想添加一個功能(享受學習)。

這是我的課(可以優化我猜)使用

library Ask; 

import 'dart:html'; 
import 'dart:async'; 
import 'dart:convert'; 

class Ask { 
    final String addr; 
    String _protocol; 
    String _port; 
    WebSocket _ws; 
    bool openned; 
    Map<int, Completer> _completer_list = {}; 
    int _counter = 0; 
    static final Map<String, Ask> _cache = <String, Ask>{}; 

    factory Ask(String addr) { 
     if (_cache.containsKey(addr)) { 
      return _cache[addr]; 
     } else { 
      final ask_server = new Ask._internal(addr); 
      _cache[addr] = ask_server; 
      return ask_server; 
     } 
    } 

    Ask._internal(this.addr); 

    Future<bool> open() { 
     if (openned) 
      return true; 
     _completer_list[0] = new Completer(); 
     if (window.location.protocol == 'http:') { 
      _port = ':8080/ws'; 
      _protocol = 'ws://'; 
     } else { 
      _port = ':8443/ws'; 
      _protocol = 'wss://'; 
     } 
     _ws = new WebSocket(_protocol + addr + _port); 
     _ws.onOpen.listen((e) { 
      _get_data(); 
      _get_close(); 
      openned = true; 
      _completer_list[0].complete(true); 
     }); 
     return _completer_list[0].future; 
    } 

    Future<String> send(Map data) { 
     bool check = false; 
     int id; 

     _completer_list.forEach((k, v) { 
      if (v.isCompleted) { 
       id = data['ws_id'] = k; 
       _completer_list[k] = new Completer(); 
       _ws.send(JSON.encode(data)); 
       check = true; 
      } 
     }); 
     if (!check) { 
      _counter++; 
      id = data['ws_id'] = _counter; 
      _completer_list[id] = new Completer(); 
      _ws.send(JSON.encode(data)); 
     } 
     return _completer_list[id].future; 
    } 

    void _get_data() { 
     _ws.onMessage.listen((MessageEvent data) { 
      var response = JSON.decode(data.data); 
      _completer_list[response['ws_id']].complete(response); 
     }); 
    } 

    void _get_close() { 
     _ws.onClose.listen((_) { 
      print('Server have been lost. Try to reconnect in 3 seconds.'); 
      new Timer(new Duration(seconds: 3),() { 
       _ws = new WebSocket(_protocol + addr + _port); 
       _get_data(); 
       _get_close(); 
       _ws.onOpen.listen((e) => print('Server is alive again.')); 
      }); 
     }); 
    } 
} 

例子:

void showIndex() { 
    Element main = querySelector('main'); 
    Ask connect = new Ask('127.0.0.1'); 
    Map request = {}; 

    request['index'] = true; 
    connect.open().then((_) { 
     connect.send(request).then((data) { 
      main.setInnerHtml(data['response']); 
     }); 
    }); 
} 

我將取代thenlisten誰將會在消息將取消完成。通過這種方式,我可以添加一個進度條,我認爲...

所以我的問題,我的發送函數可以是一個流,並保持一個websocket的所有概念? (是的,如果我的功能在請求正在進行時使用,它會被髮送,如果她在第一次之前完成,我會恢復正常,謝謝ws_id)。

謝謝。

回答