错误时重试承诺 - Typescript

时间:2016-07-18 14:27:53

标签: node.js typescript promise

我有一个使用mssql驱动程序的nodeJS应用程序与我的SQL数据库进行交互。我希望有一个函数从数据库中获取值,但是,在第一次使用时,该表将不存在,因此如果存在特定错误,我想调用我的createValue()函数。下面的代码有效,但我必须调用它两次才能获得值。基本上,如果满足.catch中的条件,我想再次调用Request。有这样一种巧妙的方法吗?

var value;
new sql.Request().query('select * from _table')
    .then(function (recordset) {
        value = recordset;
    })
    .catch(function (err) {
        console.log("Query Error: " + err);
        if (err.message == "Invalid object name '_table") {
            createValue();
        }
    })

更新

我现在有以下功能,但我应该如何最好地让它返回recordset

function getData() {
    sql.connect("mssql://username:password@localhost/mytestdatabase").then(function () {
        return new sql.Request().query('select * from _table')
            .then(function (recordset) {
                console.log(recordset); // <-- THIS IS WHAT I WANT TO RETURN
            })
            .catch(function (err) {
                console.log("Query Error: " + err);
                if (err.message == "Invalid object name '_table") {
                    updateValue();
                    return getData();
                }
                return null;
            })
    }).catch(function (err) {
        console.log("Connection Error: " + err);
    })
};

1 个答案:

答案 0 :(得分:1)

您可以将其包装在一个函数中,然后可以递归调用。 我假设createValue()是同步的。

function getData(){
    return new sql.Request().query('select * from _table')
    .catch(function (err) {
        if (err.message == "Invalid object name '_table") {
            createValue();
            return getData();
        }
        throw err;
    });
}

...

var resultsetPromise = getData();
resultsetPromise.then( function(resultset){
    // do something with your data
}).catch( function(err){
    console.log("Query Error: " + err);
});