2016-07-01 51 views
0

我是新來的異步編程。我知道這個問題已被多次詢問,但我無法理解和解決這個問題,我使用nodeJs和MsSql模塊連接到Sql Server。如何執行數組中的所有對象,然後向客戶端發送響應?

我在寫一個nodejs應用程序,它接受輸入參數並在執行每個對象的foreach循環中運行。我的問題是,一旦數組中的所有對象都被執行後,我怎樣才能將響應發送回客戶端。現在我正在執行每個對象後發回響應。

我的第二個問題是異步編程是否會導致數據庫中的死鎖?下面

代碼:

**Post call code:** 

exports.add = function (req, resp, reqbody) { 
    try { 
     if (!reqbody) 
      throw new Error(" Dude, No data !! Send Some Data"); 
     var data = JSON.parse(reqbody); 
     if (data) { 
      data.forEach(function (obj) { 
       var sql = "USE " + obj.a + " EXEC [dbo].[SP] " + obj.c+ ", " + obj.b+ ""          
        db.executeSql(sql, function (data, err) { 
        if (err) { 
         responses.show500(req, resp, err) 
        } 
        else { 
         responses.send200(req, resp) 

        } 
       }); 
      }); 
     } 
     else { 
      throw new Error("Input not valid"); 
     } 
    } 
     catch (ex) { 
     console.log(ex); 
      responses.show500(req, resp, ex); 
     } 
}; 

DB調用代碼:

var db = require("../core/db"); 
var responses = require("../core/responses"); 
exports.executeSql = function (sql, callback) { 

    var conn = new sqldb.Connection(settings.dbconfig); 
    conn.connect() 
    .then(function() { 
     var req = new sqldb.Request(conn); 
     req.query(sql) 
     .then(function (recordset) { 
      callback(recordset); 
     }) 
     .catch(function (err) { 
      callback(null, err); 
      return; 
     }); 
    }) 
    .catch(function (err) { 
     callback(null, err); 


    }); 
}; 

更新後的呼叫號碼

async.each(data, function (obj, callback) { 
        //console.log(obj); 
        var sql = "USE " + obj.a + " EXEC [dbo].[SP] " + obj.c+ ", " + obj.b+ ""   
       db.executeSql(sql, function (data, err) { 

        if (err) return callback(err); 
        callback(); 
       }) 
      }, function (err) { 
       if (err) { 
        console.error(err); 
        responses.show500(req, resp, err); 
       } else { 
        responses.send200(req, resp); 
       } 

      }) 

回答

0

您需要使用模塊async。 安裝:

npm install async 

而在你的代碼中使用:

var async = require('async'); 
... 
var data = JSON.parse(reqbody); 
var queries = data.map(function (obj) { 
    return "USE " + obj.a + " EXEC [dbo].[SP] " + obj.c+ ", " + obj.b+ ""; 
}); 
async.map(queies, db.executeSql, function (err, results) { 
    if (err) { 
     console.log(err); 
    } 

    callback(results); 
}); 
+0

感謝Sergy ..我會嘗試了這一點,以及:) – CKS

相關問題