2015-05-05 191 views
1

想象我有一個HTTP請求處理機內部以下代碼:如何處理交易錯誤?

// these come from the HTTP request payload. 
var channel = {}; 
var screencast ={}; 

try { 
    connection.beginTransaction(function(err) { 
    if (err) { 
     throw err; 
    } 
    connection.query('INSERT INTO Channels SET ?', channel, function (err, result) { 
     if (err) { 
     connection.rollback(function() { 
      throw err; 
     }); 
     } 
     connection.query('INSERT INTO Screencasts SET ?', screencast, function (err, result) { 
     if (err) { 
      connection.rollback(function() { 
      throw err; 
      }); 
     } 
     connection.commit(function(err) { 
      if (err) { 
      connection.rollback(function() { 
       throw err; 
      }); 
      } 
      console.log('success!'); 
     }); 
     }); 
    }); 
    }); 
} catch (err) { 
    // render error page or something like that. 
    console.log(err) 
} 

當發生錯誤時,我期望要調用的catch塊 - 這是並非如此。 爲什麼不呢?

我看不出拋出這麼多的錯誤,如果我不能catch他們。有人可以解釋嗎?

此外,如果我不能依靠catch塊,如何檢測到發生錯誤,然後做某事

(我知道這麼少這個代碼,因爲我適應的example

回答

0

花了一些時間瞭解承諾

var mysql = require('mysql'); 
var Promise = require('bluebird'); 
Promise.promisifyAll(require('mysql/lib/Connection').prototype); 

connection.beginTransactionAsync().then(function() { 
    return connection.queryAsync('INSERT INTO Channels SET ?', channel); 
}).then(function() { 
    return connection.queryAsync('INSERT INTO Screencasts1 SET ?', screencast); 
}).then(function() { 
    return connection.commit(); 
}).error(function(e) { 
    connection.rollback(); 
}); 
0

當您處理錯誤優先異步回調時,不會引發錯誤。錯誤被作爲回調函數的第一個參數傳遞。所以處理那裏的錯誤。 (在嵌套回調的情況下,這可能意味着簡單地調用帶有錯誤的父回調)。

基本上:您不能在這些回調中拋出錯誤,除非它們被捕獲到與其引發的回調相同的內部。