Express:处理多个依赖于彼此的休息api呼叫

时间:2015-02-07 02:58:32

标签: node.js rest express

我今天遇到了这个障碍,并且不确定以正确的方式解决它。假设我必须打四次电话给不同的休息时间。

/A, /B, /C, and /D

如果POST / A和/ B成功,但POST / C失败,我将不执行POST / D,我将不得不DELETE / A和/ B来恢复我的更改。基本上如果其中一个失败,它们都应该失败,并且不应对任何服务进行任何更改。

我想知道是否有可能异步解决这个问题,还是我必须按顺序进行每次调用?

谢谢!

1 个答案:

答案 0 :(得分:0)

这样的事情:

function task(options, done){
    // options.url will have the URL; 
    // you can add more options

    request.post(options.url).response(function(err, data){
        if(/* successful */)
            done();
        else
            request.delete(options.url);
    });
}

// do A
task({url: '/A'}, function(){
    // if this is called that means A was successful
    // do B
    task({url: '/B'}, function(){
        // .. and so on ...
    })
});

这只是一个简单的例子。有更好/更漂亮的方式,如chainingpromises


要撤消之前的操作,您可以执行以下操作:

function task(method, url, next, fail) {
    request[method](url).response(function(err) {
        if (!next) return;
        next(function(err) {
            if (err) // undoThis // then call `fail` (to undo previous)
                request.delete(url, fail);
        });
    });
}

function doA()   { task('post',   '/A', doB); }
function undoA() { task('delete', '/A'); }
function doB()   { task('post',   '/B', doC, undoA); }
function undoB() { task('delete', '/B'); }
function doC()   { task('post',   '/C', doD, undoB); }
function undoC() { task('delete', '/C'); }
function doD()   { task('post',   '/D', null, undoC); }

但是看着它,我也会用堆栈来处理它。