我不能讓迴應之前發射器發出從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。
任何幫助,將不勝感激
沙立
謝謝您的回覆。我正在研究你的帖子。 – Sarit
我不適合我。我使用forEach循環而不是單個查詢。因此'結束'信號多次來到我身邊。我通過在emiiter信號的回調函數中添加索引計數來解決這個問題。再次感謝你的努力。 SO並不是無視我是一個很好的道德支持。 – Sarit