ฉันจะ "นอนหลับ" โปรแกรม Dart ได้อย่างไร


110

ฉันต้องการจำลองการเรียกใช้บริการเว็บแบบอะซิงโครนัสในแอปพลิเคชัน Dart ของฉันเพื่อทำการทดสอบ ในการจำลองการสุ่มของการโทรจำลองเหล่านี้ที่ตอบสนอง (อาจไม่เป็นระเบียบ) ฉันต้องการตั้งโปรแกรมให้ม็อคของฉันรอ (นอนหลับ) ในช่วงเวลาหนึ่งก่อนที่จะคืน 'อนาคต'

ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


119

คุณยังสามารถใช้ Future.delayed factory เพื่อสร้างอนาคตให้เสร็จสมบูรณ์ได้หลังจากที่ล่าช้า นี่คือตัวอย่างของสองฟังก์ชันที่ส่งคืนสตริงแบบอะซิงโครนัสหลังจากการหน่วงเวลา:

import 'dart:async';

Future sleep1() {
  return new Future.delayed(const Duration(seconds: 1), () => "1");
}

Future sleep2() {
  return new Future.delayed(const Duration(seconds: 2), () => "2");
}

9
มีจุดประสงค์เพื่อ () => "1"อะไร?
Daksh Gargas

2
ฉันเดาว่าไม่มีประโยชน์มันเป็นเพียงตัวยึดสำหรับการ
คำนวณ

1
หากต้องการพักแอปด้วยฟังก์ชันเหล่านี้คุณต้องใช้ a wait:await sleep1();
Slot

76

ฉบับปี 2019:

ในรหัส Async

await Future.delayed(Duration(seconds: 1));

ใน Sync Code

import 'dart:io';

sleep(Duration(seconds:1));

หมายเหตุ:สิ่งนี้บล็อกกระบวนการทั้งหมด (แยก) ดังนั้นฟังก์ชัน async อื่น ๆ จะไม่ถูกประมวลผล นอกจากนี้ยังไม่มีในเว็บเนื่องจาก Javascript เป็นแบบ async เท่านั้น


อะไรคือความแตกต่างระหว่างพวกเขาสองคน (sleep vs Future.delayed)? เกิดอะไรขึ้นเบื้องหลังในทั้งสองสถานการณ์?
Tomas Baran

3
sleep()บล็อกการแยกทั้งหมดอย่างสมบูรณ์ ไม่มีรหัสโผจะทำงานในขณะที่หลับอยู่ มันอาจจะรวบรวมเพื่อบางสิ่งบางอย่างเช่น C ++ std::this_thread::sleep_for's Future.delayed()กำหนดเวลาให้ฟังก์ชัน async กลับมาทำงานในภายหลัง แต่จะส่งกลับการควบคุมไปยังลูปเหตุการณ์ Dart เพื่อให้ฟังก์ชัน async อื่น ๆ สามารถทำงานต่อไปได้
Timmmm

68

ไม่ใช่สิ่งที่คุณต้องการเสมอไป (บางครั้งคุณต้องการFuture.delayed) แต่ถ้าคุณต้องการนอนในแอพบรรทัดคำสั่ง Dart คุณสามารถใช้ dart: io's sleep():

import 'dart:io';

main() {
  sleep(const Duration(seconds:1));
}

ดี! ขออภัยข้อมูลนี้หาได้ยากในเว็บไซต์อย่างเป็นทางการ
Timur Fayzrakhmanov

12
ไลบรารี 'dart: io' ไม่สามารถใช้งานได้หากคุณกำลังสร้างเว็บแอปพลิเคชัน
adeel41

5
จากเอกสาร: ใช้สิ่งนี้ด้วยความระมัดระวังเนื่องจากไม่มีการดำเนินการแบบอะซิงโครนัสที่สามารถประมวลผลแยกกันได้ในขณะที่ถูกบล็อกในการโทร [sleep]
bartektartanus

2
คำเตือน : นี่คือซิงโครนัส !!! มันจะหยุดกระทู้หลัก! (ฉันเป็นคนโง่ที่ฉันทำawait sleep()และคาดหวังว่างานอื่น ๆ จะทำงานในระหว่างการนอนหลับ :(
ch271828n

1
อะไรคือความแตกต่างระหว่างพวกเขาสองคน (sleep vs Future.delayed)? เกิดอะไรขึ้นเบื้องหลังในทั้งสองสถานการณ์?
Tomas Baran

25

ฉันพบว่ามีการใช้งานหลายอย่างใน Dart เพื่อให้การดำเนินการล่าช้าของรหัส:

new Future.delayed(const Duration(seconds: 1)); //recommend

new Timer(const Duration(seconds: 1), ()=>print("1 second later."));

sleep(const Duration(seconds: 1)); //import 'dart:io';

new Stream.periodic(const Duration(seconds: 1), (_) => print("1 second later.")).first.then((_)=>print("Also 1 second later."));
//new Stream.periodic(const Duration(seconds: 1)).first.then((_)=>print("Also 1 second later."));

17

สำหรับไวยากรณ์ Dart 2+ ในบริบทฟังก์ชัน async:

import 'package:meta/meta.dart'; //for @required annotation

void main() async {
  void justWait({@required int numberOfSeconds}) async {
    await Future.delayed(Duration(seconds: numberOfSeconds));
  }

  await justWait(numberOfSeconds: 5);
} 

3

นี่เป็นการจำลองที่มีประโยชน์ที่สามารถใช้พารามิเตอร์เสริมเพื่อจำลองข้อผิดพลาด:

  Future _mockService([dynamic error]) {
    return new Future.delayed(const Duration(seconds: 2), () {
      if (error != null) {
        throw error;
      }
    });
  }

คุณสามารถใช้งานได้ดังนี้:

  await _mockService(new Exception('network error'));

-2

ฉันยังต้องรอให้บริการเสร็จสมบูรณ์ในระหว่างการทดสอบหน่วย ฉันใช้วิธีนี้:

void main()
{
    test('Send packages using isolate', () async {
        await SendingService().execute();
    });
    // Loop to the amount of time the service will take to complete
    for( int seconds = 0; seconds < 10; seconds++ ) {
        test('Waiting 1 second...', () {
            sleep(const Duration(seconds:1));
        } );
    }
}
...
class SendingService {
    Isolate _isolate;
    Future execute() async {
        ...
        final MyMessage msg = new MyMessage(...);
        ...
        Isolate.spawn(_send, msg)
            .then<Null>((Isolate isolate) => _isolate = isolate);
    }
    static void _send(MyMessage msg) {
        final IMyApi api = new IMyApi();
        api.send(msg.data)
            .then((ignored) {
                ...
            })
            .catchError((e) {
                ...
            } );
    }
}

สิ่งนี้ไม่ดีเพราะโดยปกติคุณไม่รู้ว่าบริการของคุณใช้เวลาเท่าไรจึงจะเสร็จสิ้น
mcfly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.