通过 promise $q angularjs 接收到不完整的数据
Receiving incomplete data through promise $q angularjs
当我控制台记录具有 3 个主要元素和消息的对象时,我希望获得的数据有变化:
HERE ARE THE VARIATIONS IN THE ARRAYS , then the results are:
Object {usr: Object, cat: Array[2], exp: Array[2]} // Incomplete data
Object {usr: Object, cat: Array[3], exp: Array[3]} // complete data
我正在使用 DexieJS 库从 indexedDB 获取这些数据。我有一个函数调用 3 个函数来获取所有数据,即 usr、cat、exp。我缺少 cat 和 exp 函数中的数据。我的猜测因使用错误的承诺而丢失。
这是获取 cat 数据的方法(exp 几乎与更改名称相同):
regresarCat: function () {
var deferred = $q.defer();
var cats = [];
var count = 0;
db.transaction("rw", db.categories, function () {
db.categories.orderBy('nameCat').each(function (cat) {
cats[count] = cat;
count++;
deferred.resolve(cats);
});
}).catch (function (e) {
deferred.reject(e);
});
return deferred.promise;
}
获取所有数据函数 (regresarTodo) 是下一个:
regresarTodo: function(){
var deferred = $q.defer();
var todo = [];
this.regresarUsr().then(function(user){
todo['usr'] = user;
deferred.resolve(todo);
return deferred.promise;
}).catch(function(e) {
deferred.reject(e)
});
this.regresarCat().then(function(cate){
todo['cat'] = cate;
deferred.resolve(todo);
return deferred.promise;
}).catch(function(e) {
deferred.reject(e)
});
this.regresarExp().then(function(exps){
todo['exp'] = exps;
deferred.resolve(todo);
return deferred.promise;
}).catch(function(e) {
deferred.reject(e)
});
$q.all({ usr: this.regresarUsr(), cat: this.regresarCat(), exp: this.regresarExp() }).then(function(respuesta){
console.log('Got promise');
console.log(respuesta);
deferred.resolve(respuesta);
});
return deferred.promise;
}
我找不到我的错误,我看到了这些变化,因为我用一个间隔调用 regresarTodo 函数,我看到第一次并不总是完整的,有时第二次打印完成但保留了变化。我需要第一时间获取所有数据。我很迷茫,谢谢
基本上每次调用都需要一个不同的延迟对象。并且您需要在收到来自该调用的数据后解决相应的延迟。
然后用上述所有延迟对象的承诺组成一个数组,并在
中使用该数组
$q.all(allPromisesArray).then(function(){
/* your stuff here */
})
您在 .each()
处理程序中有 deferred.resolve(cats)
,但承诺永远不应 resolve()
d 超过一次。
您正在使用的库提供了一个 .toArray()
方法,因此您应该使用它。
您也不需要使用延迟对象从头开始创建承诺; .toArray()
和 db.transaction()
为您创造承诺:
regresarCat: function () {
return db.transaction("rw", db.categories, function () {
return db.categories.orderBy('nameCat').toArray();
});
}
请注意,这还使您的函数缩短了大约 70%。
您在第二个代码示例中遇到了类似的问题。当您根本不需要在此处使用延迟时,您正试图在三个不同的地方解析单个 deferred
。您可以直接将您的承诺传递给 $q.all()
:
regresarTodo: function() {
return $q.all([this.regresarUsr(), this.regresarCat(), this.regresarExp()])
.then(function(respuesta){
console.log('Got values');
console.log(respuesta);
return { usr: respuesta[0], cat: respuesta[1], exp: respuesta[2] };
});
}
再次注意这如何使您的代码缩短大约 80%。还要注意 $q.all()
的参数应该是 array.
当我控制台记录具有 3 个主要元素和消息的对象时,我希望获得的数据有变化:
HERE ARE THE VARIATIONS IN THE ARRAYS , then the results are:
Object {usr: Object, cat: Array[2], exp: Array[2]} // Incomplete data
Object {usr: Object, cat: Array[3], exp: Array[3]} // complete data
我正在使用 DexieJS 库从 indexedDB 获取这些数据。我有一个函数调用 3 个函数来获取所有数据,即 usr、cat、exp。我缺少 cat 和 exp 函数中的数据。我的猜测因使用错误的承诺而丢失。 这是获取 cat 数据的方法(exp 几乎与更改名称相同):
regresarCat: function () {
var deferred = $q.defer();
var cats = [];
var count = 0;
db.transaction("rw", db.categories, function () {
db.categories.orderBy('nameCat').each(function (cat) {
cats[count] = cat;
count++;
deferred.resolve(cats);
});
}).catch (function (e) {
deferred.reject(e);
});
return deferred.promise;
}
获取所有数据函数 (regresarTodo) 是下一个:
regresarTodo: function(){
var deferred = $q.defer();
var todo = [];
this.regresarUsr().then(function(user){
todo['usr'] = user;
deferred.resolve(todo);
return deferred.promise;
}).catch(function(e) {
deferred.reject(e)
});
this.regresarCat().then(function(cate){
todo['cat'] = cate;
deferred.resolve(todo);
return deferred.promise;
}).catch(function(e) {
deferred.reject(e)
});
this.regresarExp().then(function(exps){
todo['exp'] = exps;
deferred.resolve(todo);
return deferred.promise;
}).catch(function(e) {
deferred.reject(e)
});
$q.all({ usr: this.regresarUsr(), cat: this.regresarCat(), exp: this.regresarExp() }).then(function(respuesta){
console.log('Got promise');
console.log(respuesta);
deferred.resolve(respuesta);
});
return deferred.promise;
}
我找不到我的错误,我看到了这些变化,因为我用一个间隔调用 regresarTodo 函数,我看到第一次并不总是完整的,有时第二次打印完成但保留了变化。我需要第一时间获取所有数据。我很迷茫,谢谢
基本上每次调用都需要一个不同的延迟对象。并且您需要在收到来自该调用的数据后解决相应的延迟。
然后用上述所有延迟对象的承诺组成一个数组,并在
中使用该数组$q.all(allPromisesArray).then(function(){
/* your stuff here */
})
您在 .each()
处理程序中有 deferred.resolve(cats)
,但承诺永远不应 resolve()
d 超过一次。
您正在使用的库提供了一个 .toArray()
方法,因此您应该使用它。
您也不需要使用延迟对象从头开始创建承诺; .toArray()
和 db.transaction()
为您创造承诺:
regresarCat: function () {
return db.transaction("rw", db.categories, function () {
return db.categories.orderBy('nameCat').toArray();
});
}
请注意,这还使您的函数缩短了大约 70%。
您在第二个代码示例中遇到了类似的问题。当您根本不需要在此处使用延迟时,您正试图在三个不同的地方解析单个
deferred
。您可以直接将您的承诺传递给 $q.all()
:
regresarTodo: function() {
return $q.all([this.regresarUsr(), this.regresarCat(), this.regresarExp()])
.then(function(respuesta){
console.log('Got values');
console.log(respuesta);
return { usr: respuesta[0], cat: respuesta[1], exp: respuesta[2] };
});
}
再次注意这如何使您的代码缩短大约 80%。还要注意 $q.all()
的参数应该是 array.