Javascript & PouchDB : 不能 return 来自 pouchdb 的对象数组(因为它是异步的?)
Javascript & PouchDB : can not return array of objects coming from pouchdb (because it is asynchronous?)
我在 Cordova 项目中使用 JS 和 PouchDB。 PouchDB数据库结构如下:
var act = {
_id: <some_id>,
activity: <some_description>,
totaltime: <string_represeting_duration>,
instances: [{datum: "04/04/18", tijd: "01:10"},{datum: "04/04/18", tijd: "00:35"}]
};
我有一个函数应该 return 对象数组,即来自字段实例:
function queryDbForDatesAndDuration(todo) {
var objDandD = [];
db.get(todo._id).then(function(doc) {
var t = doc.instances.length;
for(i=0; i<t; i++) {
objDandD[i] = {
datum: doc.instances.datum,
tijd: doc.instances.tijd
};
}
}).then(function(response) {
console.log(objDandD);
return objDandD;
}).catch(function (err) {
console.log("And error occured while querying the DB for date and duration: " + err);
});
}
对数据库的查询有效,但 returned 时未传递 ObjDandD。我首先认为这是因为 PouchDB 异步工作并且在 returned 时未解析值,但是使用 async / await 没有帮助:
async function createSingleAct(todo) {
...
var Ob = await queryDbForDatesAndDuration(todo);
...
它只是不断给出一个 TypeError :
TypeError: Ob is undefined
任何人都可以帮助我吗?我一直在拼命寻找没有结果。谢谢。
问题是您的 queryDbForDatesAndDuration
实际上 return 什么都没有。因此,虽然 db 调用工作正常,并且您的 objDandD
对象确实已设置,但仅此而已。为了让它起作用,您可以 return db.get
生成的承诺。例如:
function queryDbForDatesAndDuration(todo) {
var objDandD = [];
return db.get(todo._id).then(function(doc) {
var t = doc.instances.length;
...
但这也使 queryDbForDatesAndDuration
成为一个异步函数,因此调用者将需要使用 .then()
来访问结果。例如:
queryDbForDatesAndDuration(someTodo).then(objDandD => {
// do something with objDandD here
})
或者,正如您在问题中提出的那样,await
也应该有效。
我在 Cordova 项目中使用 JS 和 PouchDB。 PouchDB数据库结构如下:
var act = {
_id: <some_id>,
activity: <some_description>,
totaltime: <string_represeting_duration>,
instances: [{datum: "04/04/18", tijd: "01:10"},{datum: "04/04/18", tijd: "00:35"}]
};
我有一个函数应该 return 对象数组,即来自字段实例:
function queryDbForDatesAndDuration(todo) {
var objDandD = [];
db.get(todo._id).then(function(doc) {
var t = doc.instances.length;
for(i=0; i<t; i++) {
objDandD[i] = {
datum: doc.instances.datum,
tijd: doc.instances.tijd
};
}
}).then(function(response) {
console.log(objDandD);
return objDandD;
}).catch(function (err) {
console.log("And error occured while querying the DB for date and duration: " + err);
});
}
对数据库的查询有效,但 returned 时未传递 ObjDandD。我首先认为这是因为 PouchDB 异步工作并且在 returned 时未解析值,但是使用 async / await 没有帮助:
async function createSingleAct(todo) {
...
var Ob = await queryDbForDatesAndDuration(todo);
...
它只是不断给出一个 TypeError :
TypeError: Ob is undefined
任何人都可以帮助我吗?我一直在拼命寻找没有结果。谢谢。
问题是您的 queryDbForDatesAndDuration
实际上 return 什么都没有。因此,虽然 db 调用工作正常,并且您的 objDandD
对象确实已设置,但仅此而已。为了让它起作用,您可以 return db.get
生成的承诺。例如:
function queryDbForDatesAndDuration(todo) {
var objDandD = [];
return db.get(todo._id).then(function(doc) {
var t = doc.instances.length;
...
但这也使 queryDbForDatesAndDuration
成为一个异步函数,因此调用者将需要使用 .then()
来访问结果。例如:
queryDbForDatesAndDuration(someTodo).then(objDandD => {
// do something with objDandD here
})
或者,正如您在问题中提出的那样,await
也应该有效。