事务就像前端的promises库的实现一样

时间:2015-08-28 05:32:04

标签: javascript transactions promise

我在前端有非常复杂的逻辑用于将文件保存到服务器:

1) Save file1
2) Save file2
3) Save file3

如果file3无法保存,则必须还原file2和file1。现在我正在使用承诺:

file1.save().then(file2.save).then(file3.save).

我只是认为这些案例的实现可能类似于数据库的事务。有什么类似的吗?

1 个答案:

答案 0 :(得分:1)

你需要的是服务器中要恢复的某种端点,我将把该实现的逻辑留给你,只使用存根file.save()进行保存,file.revert()进行还原,并假设两者都回报了承诺:

var files = [file1, file2, file3, ...], revertFiles =[];
var promise = Promise.resolve();
files.forEach( file => 
    promise.then(() => file.save())
        .then(() => revertFiles.unshift(file))
);
promise.catch(e => revertFiles.forEach( file => promise.then( () => file.revert() )));

基本上,每当你完成一些动作时,做一堆动作来恢复它,当你面临一些失败时,只需要把所有动作都堆叠在队列中。

修改:采用es5风格

var files = [file1, file2, file3, ...], revertFiles =[];
var promise = Promise.resolve();

files.forEach(function(file){
  promise.then(function(){
    return file.save();
  }).then(function(){
    revertFiles.unshift(file);
  });
});

promise.catch(function(e){
  revertFiles.forEach(function(file){
    promise.then(function(){
      return file.revert();
    });
  });
});