2015-07-12 49 views
-2

我不能讓迴應之前發射器發出從pg模塊
返回的信號。這是我的情況。
questionHandler_upqid.js:如何先發出然後回叫?

var express = require('express'); 
var router = express.Router(); 
var pg = require('pg'); 
var connectionString = process.env.DATABASE_URL || 'postgres://admin:[email protected]:5432/mydb'; 

var question_id; 
var resource_id = []; 
//var err_ = []; //Move to local function 
var mcres = []; 
exports.addResourceFile = function(req, res, err, client, done, callback){ 
    var cb_is_func = (typeof(callback)==='function'); 
    console.log('addResourceFile function called'); 
    var err_ = []; 
    var resourcefiles = req.body.resourcefiles; 
    var idx = 0; 
    //Use local function because of err + client + done scope. 
    exports.addResourceFile_inside = function (element, index, array){ 
     console.log('addResourceFile_inside function called, index : ' + index); 
     var func_ = 'SELECT Dugong.resourcefile_Add($1,$2,$3)'; 
     //rfdata = resource file data. 
     var rfdata = [element.fileurl, 
           element.name, 
           element.type]; 
     console.log(rfdata);   

     var addResourceFile_ = client.query(func_, rfdata); 

     //Add underscore (_) to prevent confusion. 
     addResourceFile_.on('error', function(err){ 
      console.log('error signal from addResourceFile'); 
      var tempdata = {success : false, 
             id : -1, 
             reason : {errmsg : err.detail, 
                  errid : 'addResourceFile' + index }}; //plus index to spot record 
      err_.push(tempdata); 
     }); 

     addResourceFile_.on('row', function(row){ 
      console.log('row signal from addResourceFile_'); 
      resource_id.push(row.resourcefile_add); 
     }); 

     console.log('hello world'); 
     callback(err_, resource_id); 
     return ; 


    }; 

/* 
    //Want sequential run of these. 
    //But it does not. 
    resourcefiles.forEach(exports.addResourceFile_inside); 
    callback(err_, resource_id); 
    return ; 
*/ 

//Emitter emits lastest. callback executed first. 
    exports.action = function(){ 
     resourcefiles.forEach(exports.addResourceFile_inside); 
    }; 
    exports.summary = function(){ 
     callback(err_, resource_id); 
    }; 

    exports.summary(
     exports.action() 
    ); 


}; 

我的單元測試:questionHandler_upqid.js

var httpMocks = require('node-mocks-http'); 
    var test = require('unit.js'); 

    var real_questionHandler = require('../routes/questionHandler_upqid.js'); 

    var proxyquire = require('proxyquire'), 
     pgStub = { }; 

    var events = require('events'); 

    describe('questionHandler_upqid : ', function() { 
     var request; 
     beforeEach(function(){ 
     request = httpMocks.createRequest({ 
      method: 'PUT', 
       url: '/questions', 
      params: {id : 1 }, 
      body : { questiontype : 'Multiple Choice', 
          problemtext : 'Find x when x is 4 + 2', 
          excerpttext : 'Somewhere I belong', 
          solutiontext : '6',  
          authorid: 'Sarit1', 
          subjectid: '2', 
          lastmod: '2099-0101 00:00:02', 
          resourcefiles : [{"name":"penguin","type":"jpeg","fileurl":"/1.jpeg"}, 
                   {"name":"penguin","type":"jpeg","fileurl":"/2.jpeg"}, 
                   {"name":"penguin","type":"jpeg","fileurl":"/3.jpeg"}, 
                   {"name":"penguin","type":"jpeg","fileurl":"/4.jpeg"}, 
                   {"name":"penguin","type":"jpeg","fileurl":"/5.jpeg"}], 
          mcresponses : [{"text":"BX","image":"A1","iscorrect":false}, 
                  {"text":"BW","image":"A2","iscorrect":false}, 
                  {"text":"ACRA","image":"A3","iscorrect":true}, 
                  {"text":"GxM","image":"A4","iscorrect":false}] 
                  //Do not change lenght of mcresponse. 
                  //mcres_length is used in 'should add MCResponse with error' 
       } 
     }); 
     pgStub.end = function(){}; 
     }); 
    it('should add ressource file with error', function(done){ 
     //emitter emit 'error' 
     var client = {}; 
     client.query = function(querystr, data){ 
      var emitter = new events.EventEmitter(); 
       setTimeout(function(){ 
        console.log('emit diode add resource file with error'); 
        error = {detail : 'Resrc file can be changed!'}; 
        emitter.emit('error', error); 
       },0); 
       console.log('add emitters'); 
       return emitter; 
     }; 
     var response = httpMocks.createResponse(); 
     var questionHandler_upqid = proxyquire('../routes/questionHandler_upqid.js', { 'pg' : pgStub}); 
     questionHandler_upqid.addResourceFile(request, response, null, client, null, function(err, resrc_id){ 
      console.log(err); 
      console.log(resrc_id); 
      done(); 
     });   

    }); 

}); 

貌似我還沒有表現出我的學嘗試。然後我倒下了。
我有trid Promise。但是在回調被調用後它仍然會發射。我得到2個空白數組err_和resource_id。然後拿出發射器的信號。
其實我想先發射器先執行然後回調。回調應該返回給我2個數組。他們是err_和resource_id。

任何幫助,將不勝感激
沙立

回答

0

我不知道這是一種很好的編碼風格,但不是現在。我走了。

addResourceFile_.on('error', function(err){ 
    console.log('error signal from addResourceFile'); 
    var tempdata = {success : false, 
           id : -1, 
           reason : {errmsg : err.detail, 
                errid : 'addResourceFile' + index }}; //plus index to spot record 
    err_.push(tempdata); 
    console.log(idx); 
    if(idx === array.length - 1){ 
     callback(err_, resource_id); 
    } 
    idx = idx + 1; 
}); 

addResourceFile_.on('row', function(row){ 
    console.log('row signal from addResourceFile_'); 
    resource_id.push(row.resourcefile_add); 
    if(idx === array.length - 1){ 
     callback(err_, resource_id); 
    } 
    idx = idx + 1; 
}); 
0

你要回調拴在pg的事件之一,知道查詢調用前完成。

隨着'row''error'事件,其Query對象也將發出'end' event when all rows have been received successfully

addResourceFile_.on('row', function(row){ 
    console.log('row signal from addResourceFile_'); 
    resource_id.push(row.resourcefile_add); 
}); 

addResourceFile_.on('end', function() { 
    callback(null, resource_id); 
}); 

雖然,'end'事件將不會被是否有錯誤(所以你可以放心地假設null)發出的,所以你想從'error'事件調用callback以及既包括成功和失敗:

addResourceFile_.on('error', function (err) { 
    console.log('error signal from addResourceFile'); 
    var tempdata = { 
     success : false, 
     id : -1, 
     reason : { 
      errmsg : err.detail, 
      errid : 'addResourceFile' + index // plus index to spot record 
     } 
    }; 
    callback(tempdata, null); 
}); 
+0

謝謝您的回覆。我正在研究你的帖子。 – Sarit

+0

我不適合我。我使用forEach循環而不是單個查詢。因此'結束'信號多次來到我身邊。我通過在emiiter信號的回調函數中添加索引計數來解決這個問題。再次感謝你的努力。 SO並不是無視我是一個很好的道德支持。 – Sarit

相關問題