无法通过某些回调返回对象
Trouble returning object through some Callbacks
我能够取回数据,但我似乎无法通过上面的一些方法取回结果:
car.js
'use strict';
var Q = require('q');
var pg = require('co-pg')(require('pg'));
var config = require('../../models/database-config');
var car = module.exports = {};
car.find = Q.async(function *(id)
{
var query = 'SELECT id, title, description FROM cars WHERE id = ' + id;
var connectionResults = yield pg.connectPromise(config.connection);
var client = connectionResults[0];
var done = connectionResults[1];
var result = yield client.queryPromise(query);
done();
console.log("value: " + result.rows[0].id);
return result.rows;
});
这 returns 我的 console.log 的有效值,所以我知道我正在取回数据。
但是现在,当我尝试将其备份到堆栈时,在这里我似乎在使用此方法后丢失了它:
database.js
module.exports = {
models: {
car: _carModel
},
find: Q.async(_find)
};
function _find(carId)
{
_carModel.find(carId)
.then(function(result){
console.log('result[0].id: ' + result[0].id);
return result;
})
.catch(function(error){
console.log("promise error: " + error);
})
.done();
};
所以这也有效,我得到了 console.log('result[0].id: ' + result[0].id);
的有效值
但是现在当尝试调用这个函数时,我失去了结果:
gateway.js
var car = database.find(carId);
console.log("car: " + car.id);
...
这里我得到一个'Cannot read property 'id' of undefined]'
更新 #2
所以我现在正尝试传播承诺,但仍然未定义行 console.log("returned car data: " + data); 'data' 未定义。
gateway.js
module.exports = {
data: function(someData){
_data = someData;
},
find: function(text, result){
if(!text){
results(null);
};
var endpoint = _endpoint.replace(/_text/g, text);
_client.query(endpoint, function(results){
var cars = [];
var car;
for (var i = 0; i < results.docs.length; i++){
var carId = results.docs[i].id;
car = database.find(carId)
.then(function(data){
console.log("returned car data: " + data);
})
.done();
cars.push(car);
}
result(cars);
});
}
database.js
'use strict';
var Q = require('q');
var _obituaryModel = require('../../models/postgreSQL/obituary');
module.exports = {
models: {
obituary: _carModel
},
find: Q.async(_find)
};
function _find(carId)
{
_carModel.find(carId)
.then(function(result){
console.log('result[0].id: ' + result[0].id);
return result;
})
.catch(function(error){
console.log("promise error: " + error);
})
.done();
};
carModel.js
'use strict';
var Q = require('q');
var pg = require('co-pg')(require('pg'));
var config = require('../../models/database-config');
var car = module.exports = {};
car.find = Q.async(function *(id)
{
var query = 'SELECT id, title, description FROM cars WHERE id = ' + id;
var connectionResults = yield pg.connectPromise(config.connection);
var client = connectionResults[0];
var done = connectionResults[1];
var result = yield client.queryPromise(query);
done();
console.log("value: " + result.rows[0].id);
return result.rows;
});
您不能 return 来自异步函数的数据。
看这里:How to return value from an asynchronous callback function?
您正在控制台上打印 result[0].id
,但在实际调用时读取 result.id
:
尝试
var car = database.find(carId);
console.log("car: " + car[0].id);
...
您有一个 promise 对象供您使用,请使用它。
在database.js中:
return _obituaryModel.find(carId)
和gateway.js
var car = database.find(carId);
car.then(function (data) {
console.log(data);
});
我能够取回数据,但我似乎无法通过上面的一些方法取回结果:
car.js
'use strict';
var Q = require('q');
var pg = require('co-pg')(require('pg'));
var config = require('../../models/database-config');
var car = module.exports = {};
car.find = Q.async(function *(id)
{
var query = 'SELECT id, title, description FROM cars WHERE id = ' + id;
var connectionResults = yield pg.connectPromise(config.connection);
var client = connectionResults[0];
var done = connectionResults[1];
var result = yield client.queryPromise(query);
done();
console.log("value: " + result.rows[0].id);
return result.rows;
});
这 returns 我的 console.log 的有效值,所以我知道我正在取回数据。
但是现在,当我尝试将其备份到堆栈时,在这里我似乎在使用此方法后丢失了它:
database.js
module.exports = {
models: {
car: _carModel
},
find: Q.async(_find)
};
function _find(carId)
{
_carModel.find(carId)
.then(function(result){
console.log('result[0].id: ' + result[0].id);
return result;
})
.catch(function(error){
console.log("promise error: " + error);
})
.done();
};
所以这也有效,我得到了 console.log('result[0].id: ' + result[0].id);
的有效值但是现在当尝试调用这个函数时,我失去了结果:
gateway.js
var car = database.find(carId);
console.log("car: " + car.id);
...
这里我得到一个'Cannot read property 'id' of undefined]'
更新 #2
所以我现在正尝试传播承诺,但仍然未定义行 console.log("returned car data: " + data); 'data' 未定义。
gateway.js
module.exports = {
data: function(someData){
_data = someData;
},
find: function(text, result){
if(!text){
results(null);
};
var endpoint = _endpoint.replace(/_text/g, text);
_client.query(endpoint, function(results){
var cars = [];
var car;
for (var i = 0; i < results.docs.length; i++){
var carId = results.docs[i].id;
car = database.find(carId)
.then(function(data){
console.log("returned car data: " + data);
})
.done();
cars.push(car);
}
result(cars);
});
}
database.js
'use strict';
var Q = require('q');
var _obituaryModel = require('../../models/postgreSQL/obituary');
module.exports = {
models: {
obituary: _carModel
},
find: Q.async(_find)
};
function _find(carId)
{
_carModel.find(carId)
.then(function(result){
console.log('result[0].id: ' + result[0].id);
return result;
})
.catch(function(error){
console.log("promise error: " + error);
})
.done();
};
carModel.js
'use strict';
var Q = require('q');
var pg = require('co-pg')(require('pg'));
var config = require('../../models/database-config');
var car = module.exports = {};
car.find = Q.async(function *(id)
{
var query = 'SELECT id, title, description FROM cars WHERE id = ' + id;
var connectionResults = yield pg.connectPromise(config.connection);
var client = connectionResults[0];
var done = connectionResults[1];
var result = yield client.queryPromise(query);
done();
console.log("value: " + result.rows[0].id);
return result.rows;
});
您不能 return 来自异步函数的数据。
看这里:How to return value from an asynchronous callback function?
您正在控制台上打印 result[0].id
,但在实际调用时读取 result.id
:
尝试
var car = database.find(carId);
console.log("car: " + car[0].id);
...
您有一个 promise 对象供您使用,请使用它。
在database.js中:
return _obituaryModel.find(carId)
和gateway.js
var car = database.find(carId);
car.then(function (data) {
console.log(data);
});