2014-07-06 7 views
1
나는 내가 내부 함수 내에서 외부 함수 값을 반환해야한다고 발견 된 브라우저 측 인덱스 DB에서 개체를 삭제 것입니다 다트의 함수 작성했다

:내부 함수/스트림 수신기 내부에서 함수 값을 반환하는 방법은 무엇입니까?

Future<bool> delete() { 
    Transaction tx = db.transactionStore(storeName, "readwrite"); 
    ObjectStore os = tx.objectStore(storeName); 
    os.delete(_key); // returns blank future, modifies tx 

    // This is not correct, but shows the idea: 
    if (tx.onComplete) {return true;} 
    if (tx.onError) {return false;} 
} 

이를 함수는 인덱스 된 DB에 저장하고로드하는 데 사용하는 클래스의 메서드입니다. 삭제 작업이 성공 또는 실패 할 때 true 또는 false을 반환하거나이 객체를 포함하는 Future 객체를 반환하려고합니다. 그러나 병목 현상은 os.delete(_key);입니다. 미래를 반환하지만 삭제 작업의 실제 성공 또는 실패는 tx.onCompletetx.onError에 의해 제공됩니다. 내부 당신이 볼 수 있듯이 나는 익명 함수를 만들 때

tx.onComplete.listen((e){ 
    return_to_outer_function(true); 
}); 
tx.onError.listen((e){ 
    return_to_outer_function(false); 
}); 
return_to_outer_function(bool) { 
    return bool; // doesn't work 
} 

는, return 문은 더 이상 방법을 완료하지만, 이러한 객체 모두 스트림, 그래서 그들로부터 이벤트를 처리하지 익명 함수를 작성해야 기능. 내부 함수가 다른 함수를 호출하도록 할 수는 있지만 다른 함수는 결과를 전체 메소드로 리턴하지 않는 자체의 return 문을가집니다.

임시 변수를 설정하고 주기적으로 검사하는 접근법을 시도했지만 잠재적 인 버그뿐만 아니라 단일 스레드 이벤트를 사용하기 때문에 사용하지 않으려 고하는 매우 유쾌하지 않은 해결책입니다 고리.

내부 함수에서 외부 함수로 값을 반환 할 수 있습니까? 아니면 일련의 스트림에서 이벤트의 존재 또는 부재로 가치를 얻는 다른 방법이 있습니까? 아니면이 문제를 피할 수있는 IndexedDB를 사용하는 다른 방법이 있습니까?

답변

4

이 경우 Completer을 사용할 수 있습니다.

Future<bool> delete() { 
    Completer completer = new Completer(); 
    Transaction tx = db.transactionStore(storeName, "readwrite"); 
    ObjectStore os = tx.objectStore(storeName); 

    tx.onError.first((e){ 
    //return_to_outer_function(false); 
    completer.complete(false); 
    }); 
    tx.onComplete.first(bool) { 
    //return bool; // doesn't work 
    completer.complete(true) 
    } 
    os.delete(_key); // register listeners and then do delete to be on the save side 

    return completer.future; 
} 

당신은

delete().then((success) => print('succeeded: $success')); 

https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/dart:async.Completer

를 참조 같이 호출
관련 문제