2015-09-24 32 views
1

當我從API接收到我的令牌已過期的錯誤時,我希望能夠重新發出新令牌,並在第一次發送時重複請求,而不會讓用戶感覺到任何差異。有沒有辦法優雅地處理這個用例?Javascript承諾:如何處理API調用中的令牌失效?

function relogin(userInfo) { 
    return Q.Promise(function (resolve, reject) { 
     // ... 
    }); 
} 

function makeTransaction(token, options) { 
    dataOperations.makeTransaction(token, options).then(function (result) { 
     // notify ui - new data yey! 
    }).catch(function (err) { 
     if (err.code === 304) { 
      relogin.then(function (token) { 
       makeTransaction(token, options); 
      }).catch(function (err) { 
       // notify UI - problems with server 
      }); 
     } 
    }); 
} 
+0

僅供參考,明確要求第三方庫的東西是在這裏被認爲是主題。但是,您可以展示迄今爲止所做的工作,描述您遇到困難的地方並詢問如何解決問題。 – jfriend00

+0

很高興知道。我經歷了「我如何提出一個好問題?」在提問時刷新我對最佳實踐的記憶。謝謝。 – Guy

回答

1

的代碼看起來很不錯了。你的問題具體是什麼?如果你有很多交易和你擔心重複代碼,並檢查HTTP 304多次,你可以換你的交易處理程序:

function relogin(userInfo) { 
    return Q.Promise(function(resolve, reject) { 
    // ... 
    }); 
} 

function myTask(params) { 
    return Q.Promise(function(resolve, reject) { 
    // ... 
    }); 
} 

function doTask(fn, context, params) { 
    return fn.apply(context, params).then(function(results) { 
    return results; 
    }).catch(function(err) { 
    if (err.code === 304) { 
     return relogin({}).then(doTask(fn, context, params)); 
    } 
    else { 
     return err; 
    } 
    }); 
} 

// ... 

$("#foo").on("click", function(e) { 
    doTask(myTask, this, params).done(function(results) { 
    alert("all done"); 
    }).catch(function(err) { 
     alert(err); 
    }); 
}); 
+0

這可以無限循環304的...將想要添加最大數量的重試。 – Chris