Rumah > Soal Jawab > teks badan
Saya mempunyai beberapa tugasan tak segerak (terikat I/O) untuk dilakukan dan kemudian saya ingin menggunakan nilai Chai
来assert
yang dikembalikan. Daripada menulis sekeping kod seperti ini:
expect(await taskA.someAsync()).to.be.eq(something); expect(await taskB.someAsync()).to.be.eq(something);
Saya mahu menunggu semua tugasan selesai, menggunakan await Promise.all([taskA.someAsync(), taskB.someAsync()])
,然后逐个expect
或assert
hasil.
Saya mencipta fungsi ini (pseudokod) untuk menjadikan perkara lebih generik:
type TransactionInfo = { txn: Promise<any>; // 要等待的异步任务 assertion: Chai.Assertion // 要在txn结果上运行的断言 } const assertAll = async function(...txns: TransactionInfo[]) { let values = await Promise.all(allTxns); for (let txnInfo of txns) { evaluate(txnInfo.assertion) } }
Tujuan fungsi ini adalah await
所有的txns
,然后对每个txn运行每个assertion
untuk mengesahkan nilai yang dikembalikan.
Pertama sekali, saya tidak pasti Chai.Assertion
类型对于assertion
是否正确。其次,我不知道如何实例化一个包含不同类型断言(如eq
或have.lengthOf
)的TransactionInfo
数组。最后,我不知道如何在以后评估assertion
objek.
P.S. Saya bukan pembangun JavaScript profesional. Harap baik hati :)
P粉6620895212023-09-17 14:13:13
import { expect } from 'chai'; type TransactionInfo = { txn: Promise<any>; // 要等待的异步任务 assertion: () => void; // 表示要在txn结果上运行的断言函数 }; const assertAll = async function (...txns: TransactionInfo[]) { let values = await Promise.all(txns.map((txnInfo) => txnInfo.txn)); txns.forEach((txnInfo, index) => { txnInfo.assertion(values[index]); }); };
Menggunakan kod ini, anda kini boleh membuat pelbagai objek TransactionInfo, setiap satu dengan fungsi penegasan tersuainya sendiri:
// 示例用法: const txn1: TransactionInfo = { txn: someAsyncTaskA(), assertion: (result) => { expect(result).to.be.eq(something); }, }; const txn2: TransactionInfo = { txn: someAsyncTaskB(), assertion: (result) => { expect(result).to.have.lengthOf(3); }, }; // 使用TransactionInfo对象数组调用assertAll函数 await assertAll(txn1, txn2);