2013-04-26 2 views
3

나는 이것 (비동기 및 선물)에 관한 많은 게시물과 기사를 읽었으며 현재 상황이 무엇인지 확신 할 수 없습니다. 나는 다양한 변형을 시도했다. 가) 표 B를 선택)을 테이블에 행을 삽입합니다비동기 코드를 순서대로 처리하는 방법

import 'dart:async' as async; 
import 'dart:io'; 
import 'dart:math'; 
import 'package:postgresql/postgresql.dart' as pg; 

var uri = 'postgres://admin:[email protected]:5432/testdb'; 
List lgNames = ['Peter', 'Robert', 'Mary', 'Marg', 'William', 
      'Vern', 'Dermot', 'Monty', 'Peggy', 'Sue', 'William']; 

List lgUsed = []; 

Random rand1 = new Random(); 

void main() { 
    pg.connect(uri).then((oDb) { 
    print ("Connected to database"); 

    fClearTable(oDb).then((String sResult){ 
     print(sResult);  

     for (int iPos = 0; iPos < 3; iPos++) { 
     fListTable(oDb, "Select before Insert number ${iPos+1}").then((String sResult) => 
      print(sResult)); 

     fInsertData(oDb, "Insert Number ${iPos+1}").then((String sResult) => 
      print(sResult));   

     fListTable(oDb, "Select after Insert number ${iPos+1}").then((String sResult) => 
      print(sResult)); 
     } 
    }); 
    }); 
} 

async.Future<String> fClearTable(oDb) { 
    async.Completer oCompleter = new async.Completer(); 
    oDb.execute("DELETE FROM test01").then((oResult){ 
    oCompleter.complete("Table has been cleared"); 
    }); 
    return oCompleter.future; 
} 

async.Future<List> fListTable(oDb, sMsg) { 
    async.Completer oCompleter = new async.Completer(); 
    oDb.query("SELECT * FROM test01").toList().then((lResult){ 
    String sResult = "$sMsg = $lResult"; 
    oCompleter.complete(sResult); 
    }); 
    return oCompleter.future; 
} 

async.Future<String> fInsertData(oDb, sMsg) { 
    async.Completer oCompleter = new async.Completer(); 
    oDb.execute("Start Transaction").then((oResult){ 
    String sName; 
    for (bool tFound = true; tFound;) { 
     int iPos = rand1.nextInt(10); 
     sName = lgNames[iPos]; 
     tFound = false; // init 
     for (iPos = 0; iPos < lgUsed.length && !tFound; iPos++){ 
     tFound = (sName == lgUsed[iPos]); 
     } 
    } 
    lgUsed.add(sName); 
    String sSql = """INSERT INTO test01 (name) 
     VALUES ('$sName')"""; 
    print("$sSql"); 
    oDb.execute(sSql).then((oVal){ 
     oDb.execute("COMMIT").then((oVal){ 
     oCompleter.complete(sMsg); 
     }); 
    }); 
    }); 
    return oCompleter.future; 
} 

프로그램의 의도는 루프에 세 번이고 :

나는 과정 순서에 다음 코드를 시도하고있다. c) 테이블 선택

프로그램의 출력 결과에는 세 개의 삽입물이 모두 동시에 나타납니다. 프로그램의 종료에 psql의에서

Connected to database 
Table has been cleared 
Select before Insert number 1 = [] 
INSERT INTO test01 (name) 
    VALUES ('Vern') 
Select after Insert number 1 = [] 
Select before Insert number 2 = [] 
INSERT INTO test01 (name) 
    VALUES ('Peter') 
Select after Insert number 2 = [] 
Select before Insert number 3 = [] 
INSERT INTO test01 (name) 
    VALUES ('Robert') 
Select after Insert number 3 = [] 
Insert Number 1 
Insert Number 2 
Insert Number 3 

추려낸 보여줍니다 :

testdb=# select * from test01; 
id | name 
-----+-------- 
157 | Vern 
158 | Peter 
159 | Robert 
(3 rows) 

내가 IE를 원하는 것을 달성 할 수있는 방법이 있나요 다음과 같이

프로그램의 출력입니다. 삽입물이 테이블에 새 값을 표시 한 후에 선택 하시겠습니까?

모든 관련 의견을 환영합니다.

답변

4

시작하려면 here's 선물이 다트에서 작동하는 방법에 대한 훌륭한 기사를 시작하십시오.

당신이 정말로 알아야 할 것은 모든 동기 코드가 완료된 후 Futures 내의 코드가 실행된다는 것입니다. 또한 선물은 정의에 따라 비동기 적으로 완료되므로 하나의 미래가 쇠사슬로 묶여 있지 않으면 다른 하나가 완료되기를 기대하는 것이 타당하지 않습니다. 이다

는 대답이 인쇄됩니다

main() { 
    print('first'); 
    someFutureCall().then((_) => print('second?')); 
    someOtherFutureCall().then((_) => print('third?')); 
    print('last?'); 
} 

'? 마지막'첫 번째 '다음 두 가지 선물은 어떤 순서로도 완성 될 수 있습니다. 먼저 완료 할 것을 알 수 없습니다. 아시다시피 동기식 코드가 먼저 발생합니다.

올바른 순서를 위해 수행

main() { 
    print('first'); 
    someFutureCall() 
    .then((_) => print('second?')) 
    .then((_) => someOtherFutureCall()) 
    .then((_) => print('third?')) 
    .then((_) => print('last?')); 
} 
그래서 샘플은 순서가 보존되지 않습니다하는 방식으로 미래를 사용합니다. 원하는 내용은 다음과 같습니다.

void main() { 
    pg.connect(uri).then((oDb) { 
    print ("Connected to database"); 
    return fClearTable(oDb); 
    }).then((String sResult){ 
    print(sResult);  
    return Future.forEach([0, 1, 2], (i) { 
     return fListTable(oDb, "Select before Insert number ${iPos+1}") 
     .then((String sResult) => print(sResult)) 
     .then((_) => fInsertData(oDb, "Insert Number ${iPos+1}")) 
     .then((String sResult) => print(sResult)) 
     .then((_) => fListTable(oDb, "Select after Insert number ${iPos+1}")) 
     .then((String sResult) => print(sResult)); 
    }); 
    }); 
} 

API documentation for Futures도 참조하십시오.

관련 문제