NodeJS, вызов функции не возвращается неопределенным даже после завершения
Здравствуйте: я новичок в nodejs и мокко. Я борюсь с возвращаемым значением из вызова функции. Он всегда возвращает 'undefined', хотя (я думаю) я использовал callback done() соответствующим образом.
В следующем примере, как я могу убедиться, что возвращаемое значение из get() всегда возвращает правильное значение, а не 'undefined'. В этой функции я использовал модуль requestJS, чтобы открыть google.com и вернуть тип контента. Тем не менее, в настоящее время он возвращает неопределенное.
Большое спасибо!
Обновлены сделанные посты обратной связи:
- включены
Test Case 3
пример, чтобы реализоватьCallback
, Результат: теперь я могу распечатать данные по желанию. Тем не менее, я получаю и сообщаю об ошибке, чтобы вызвать done(). Что я делаю неправильно?
Пост результатов работает на терминале узла
suite
PRINT DATA: 200 text/html; charset=ISO-8859-1
√ Test case 1 (607ms)
undefined (<< ****** how to return the correct value?** )
PRINT DATA: 200 text/html; charset=ISO-8859-1
√ Test case 2 (603ms)
PRINT DATA: 200 text/html; charset=ISO-8859-1
√ Test case 3
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
...
Google.js
var request = require('request');
describe('suite', function(){
it('Tase case 1', function(done){
var options = { url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}};
request.get(options, function (err, res, body){
console.log("PRINT DATA: " + res.statusCode + ' ' + res.headers['content-type']);
//do some stuff here
done();
});
});
it('Test case 2', function(done){
console.log(get(done));
});
it('Test Case 3', function(){
doCallback(callbackHandler);
});
});
function get(done){
var options = {
url: 'http://www.google.com',
headers: {'Content-Type': 'text/html'},
encoding: null
};
request.get(options, function(err, res, body){
console.log("PRINT DATA: " + res.statusCode + ' ' + res.headers['content-type']);
//do some stuff here
return done(), res.headers['content-type'];
});
}
function callbackHandler(data) {
console.log("PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']);
}
function doCallback(done){
var options = {url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}, encoding: null};
request.get(options, function(err, res, body){
var finalData = res;
return done(finalData);
});
}
1 ответ
Одно из возможных решений (использование обратного вызова)
var request = require('request');
describe('suite', function(){
it('Test Case 3', function(done){
doCallback(callbackHandler, done);
});
it('Test Case: 3A', function(done){
doCallback(function(data){
console.log("PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']);
done();
});
});
});
function callbackHandler(data, done) {
console.log("PRINT DATA: " + data.statusCode + ' ' + data.headers['content-type']);
done();
}
function doCallback(callback, done){
var options = {url: 'http://www.google.com', headers: {'Content-Type': 'text/html'}, encoding: null};
request.get(options, function(err, res, body){
return callback(res, done);
});
}
Одно из возможных решений (используя обещание)
var request = require('request');
describe('suite', function () {
this.timeout(10000);
it('Test Case 3', function () {
return doCallback()
.then(function (res) {
console.log(res.statusCode + " " + res.headers['content-type']);
})
.catch(function(res){
console.log(res);
});
}); });
function doCallback() {
return new Promise(
function (resolve, reject) {
var options = { url: 'http://www.google.com', headers: { 'Content-Type': 'text/html' }, encoding: null };
request.get(options, function (err, res, body) {
if (err)
reject(err);
else
resolve(res);
});
}
); }