簡體   English   中英

如何在 javascript 中使用 defer/promise 進行數據庫調用

[英]how to use defer/promise in javascript for a db call

我有帶有 db 相關函數的 db.js,我想調用 db.js 並等待它返回查詢結果。 但是執行db調用后返回結果。 任何人都可以請幫助如何解決這個問題。

代碼示例:

var Q = require('q');

db= require("./dbaccess.js");

function waitfor(ms){

     var deferred = Q.defer();

     setTimeout(function() {

        deferred.resolve(db);
     }, 5000);
     return deferred.promise;
}

waitfor(2000).done(function(dbcall) {

console.log('contrived example '+ dbcall.query1()); 

});

數據庫訪問.js:

var sql = require('mssql');

var config = {

user: 'xx',

    password: 'xxx',

    server: 'aaa', 

    database: 'RequestCenter',

    stream: true,  

}

this.query1=function() {

sql.connect(config, function(err) {

    var result;
    var request = new sql.Request();
    request.query("select * from dbo.AcAccount where Name like 'AutomationCli%' ");  
    request.on('row', function(row) {
        console.log(row.Name);
        result = row.Name;
    });

    request.on('error', function(err) {
        console.log("err : "+err); 
    });

    request.on('done', function(returnValue) {
        console.log("done"); 
    });
    return result;
});



sql.on('error', function(err) {

console.log("sql err : "+err);

});

}

輸出:

contrived example undefined

in db: AutomationClient

預期輸出:

in db: AutomationClient

contrived example AutomationClient

不知道為什么您的主要代碼為ms參數傳入 2000 年,然后超時 5000 ms ,事實上,您為什么要超時,如果這是等待 db 函數完成的某種嘗試,那么您不會不需要

如果你必須使用承諾——我個人會為這樣簡單的代碼使用一個簡單的回調,但是,我知道你想學習如何使用承諾

您的原始代碼看起來像是試圖返回LAST row.name的值

此代碼返回一個row.name數組

不知道您將獲得的數據類型,我不知道哪個是正確的

數據庫

var Q = require('q');
var sql = require('mssql');

var config = {
    user: 'xx',
    password: 'xxx',
    server: 'aaa',
    database: 'RequestCenter',
    stream: true,

}

this.query1 = function() {
    var deferred = Q.defer();
    sql.connect(config, function(err) {
        var result = []; // return all rows - modify as required
        var request = new sql.Request();
        request.query("select * from dbo.AcAccount where Name like 'AutomationCli%' ");
        request.on('row', function(row) {
            console.log(row.Name);
            result.push(row.Name);
        });

        request.on('error', function(err) {
            console.log("err : " + err);
            deferred.reject(err);
        });

        request.on('done', function(returnValue) {
            deferred.resolve(result);
        });
    });

    sql.on('error', function(err) {
        console.log("sql err : " + err);
        deferred.reject(err);
    });
    return deferred.promise;
}

代碼示例:

db = require("./dbaccess.js");

db.query1().then(function(result) {
    console.log('contrived example ' + result);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM