ValueScript의 트랜잭션 시도 블록
Apr 02 2023
예외는 바로잡기가 어렵습니다. 간과하기 쉬운 특히 까다로운 문제는 try 블록 내에서 부분 평가의 가능성입니다.
예외는 바로잡기가 어렵습니다. try간과하기 쉬운 특히 까다로운 문제는 블록 내부의 부분 평가 가능성입니다 .
다음 JavaScript 프로그램을 고려하십시오.
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
{
a: [],
b: ["item2", "item3", "item4", "item1"],
}
{
a: [],
b: ["item2", "item3", "item4"],
}
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
if (b.isFull()) {
throw new Error("b is full");
}
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
또 다른 옵션은 변경될 수 있는 변수의 복사본을 저장하고 다음에서 복원하는 것입니다 catch.
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
const aCopy = a.copy();
const bCopy = b.copy();
try {
const item = a.pop();
b.push(item);
} catch (e) {
a = aCopy;
b = bCopy;
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
- 장황하고 불필요하게 방어적인 느낌이 들기 때문에 하지 않을 수도 있습니다.
copy작업을 정의 해야 합니다.- 작업이 존재하는 경우
copy효율적이지 않을 수 있습니다. - 부작용이 있는 경우
a.pop해당 부작용은 되돌릴 수 없습니다.
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
let item;
try {
item = a.pop();
} catch (e) {
console.error("Failed to move item from a to b", e);
console.log({ a, b });
return;
}
try {
b.push(item);
} catch (e) {
a.unPop(item);
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
- 매우 장황함
a.unPop(item)b.push(item)여전히 놓치기 쉬운 실패 시 이 작업이 필요하다는 것을 이해해야 합니다.
ValueScript에서 try블록은 트랜잭션입니다. 완료될 때까지 실행되거나 되돌려집니다.
우리의 원래 프로그램은 수정 없이 우리가 원하는 것을 수행합니다.
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
{
a: ["item1"],
b: ["item2", "item3", "item4"],
}
- "You might not do it"
— ValueScript 컴파일러가 지침을 자동으로 삽입합니다. - "
copy작업 필요"
— ValueScript는 값 의미론을 사용하고 단지 를 사용하며aCopy = a이는 복사와 동일합니다. - "
copy효율적이지 않을 수 있음"
— ValueScript는 기록 중 복사를 끝까지 사용하므로 매우 효율적입니다. - "Side effects of
a.popwill be reverted"
— ValueScript에는 부작용이 없습니다.
* 일부 멋진 외부 기능에는 되돌리기 작업이 포함될 수 있으며 자동으로 호출됩니다.
ValueScript는 값 의미 체계가 있는 TypeScript의 방언입니다. 이 기사의 프로그램 데모를 포함하는 온라인 놀이터가 있으며 오픈 소스 입니다 .

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































