打字稿中的顺序承诺
Sequential Promises in typescript
我有一个带有保存方法的打字稿 class,我希望下次调用保存方法时,只在第一次调用完成后发生。
想象一下以下情况:
count = 0;
async save() {
let x = this.count++;
console.log("start " + x);
await axios.post("***",{});
console.log("end " + x);
}
}
在这种情况下 - 当用户调用保存时,无需等待 - 第二个 post 可以在第一个完成之前调用 - 导致各种问题。
我想到的解决方案是:
lastSave = Promise.resolve();
count = 0;
async save() {
this.lastSave = this.lastSave.then(async () => {
let x = this.count++;
console.log("start " + x);
await axios.post("***",{});
console.log("end " + x);
});
}
这是一个有效的解决方案,还是有更好的方法?
这种 then
最后一个承诺的模式是完全有效的。您当前拥有的唯一问题是错误处理。在您当前的代码中,如果 一个 请求失败,它将使所有未来的请求失败。
更完整的解决方案如下:
lastSave = Promise.resolve();
count = 0;
async save() {
const savePromise = this.lastSave.then(async () => {
let x = this.count++;
console.log("start " + x);
await axios.post("***",{});
console.log("end " + x);
});
// wait but don't fail forever on errors
this.lastSave = savePromise.then(() => {}).catch(() => {});
// You also need to return the promise so callers can react
// to it. Note the lack of `.catch` here to not interfere with error handling
return await savePromise;
}
我有一个带有保存方法的打字稿 class,我希望下次调用保存方法时,只在第一次调用完成后发生。 想象一下以下情况:
count = 0;
async save() {
let x = this.count++;
console.log("start " + x);
await axios.post("***",{});
console.log("end " + x);
}
}
在这种情况下 - 当用户调用保存时,无需等待 - 第二个 post 可以在第一个完成之前调用 - 导致各种问题。
我想到的解决方案是:
lastSave = Promise.resolve();
count = 0;
async save() {
this.lastSave = this.lastSave.then(async () => {
let x = this.count++;
console.log("start " + x);
await axios.post("***",{});
console.log("end " + x);
});
}
这是一个有效的解决方案,还是有更好的方法?
这种 then
最后一个承诺的模式是完全有效的。您当前拥有的唯一问题是错误处理。在您当前的代码中,如果 一个 请求失败,它将使所有未来的请求失败。
更完整的解决方案如下:
lastSave = Promise.resolve();
count = 0;
async save() {
const savePromise = this.lastSave.then(async () => {
let x = this.count++;
console.log("start " + x);
await axios.post("***",{});
console.log("end " + x);
});
// wait but don't fail forever on errors
this.lastSave = savePromise.then(() => {}).catch(() => {});
// You also need to return the promise so callers can react
// to it. Note the lack of `.catch` here to not interfere with error handling
return await savePromise;
}