2015-02-07 50 views
0

我今天遇到了這個障礙,並不確定是否有正確的解決方法。假設我必須對不同的休息API進行四次呼叫。特快:處理多個彼此依賴的休息API調用

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

如果POST/A和/ B成功,但POST/C失敗,我將不會執行POST/d,我不得不刪除/ A和/ B恢復我的變化。基本上,如果其中一個失敗,他們應該全部失敗,並且不應該對任何服務進行更改。

我想知道是否有可能異步解決這個問題,還是我必須按順序進行每個呼叫?

謝謝!

回答

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); } 

但是看着它,我也用它處理去疊加。

+0

感謝您的快速回復!我只是想知道如果這種方法將允許我刪除/ A如果/ B失敗?否則,我將不得不使用類似堆棧的東西來保存成功調用的url,並在後續調用失敗時開始彈出並調用url上的delete。 – ColdMonkey 2015-02-07 05:54:54

+0

感謝您的幫助! – ColdMonkey 2015-02-07 21:51:03