gpt4 book ai didi

javascript - 为什么它对数组正确但对对象却不正确?

转载 作者:行者123 更新时间:2023-11-30 08:36:16 27 4
gpt4 key购买 nike

我正在开发 AngularJS 应用程序并发现了以下行为。

我的服务有两个功能。第一个函数返回存储在数据库中的所有类别,第二个函数通过其 id 返回一个类别。

这是我的服务:

angular.module('categoriesRepository', [])
.service('categoriesRepository', ['$cordovaSQLite', 'sqliteHelper',
function ($cordovaSQLite, sqliteHelper) {
//this works - returns an array with all categories
this.getAll = function () {
var categories = [];

$cordovaSQLite.execute(sqliteHelper.getDb(),
"SELECT * FROM categories;")
.then(function (res) {
for (var i = 0; i < res.rows.length; i++) {
categories.push(res.rows[i]);
}
});

return categories;
}

//this works not - returns undefined
this.getById = function (id) {
var category;

$cordovaSQLite.execute(sqliteHelper.getDb(),
"SELECT * FROM categories WHERE id = ?;", [id])
.then(function (res) {
category = res.rows[0];
});

return category;
}

}]);

我知道我可以使用 Angulars $q 异步运行函数,并在它们完成处理后使用它们的值。

为什么getById函数直接返回类别,getAll等到数组填满?

编辑

我把 getAll 函数贴错了。 $cordovaSQLite.execute 之前没有返回语句

最佳答案

更新:-在您的问题更新后。

  1. 在第一个示例中,您首先通过执行 var categories = []; 创建一个数组,然后在完成异步调用之前返回该数组。当您的异步调用完成时,它只是将某些元素插入数组,因此不会破坏对数组(类别)变量的引用。当它返回时,如果你要调试它,你会发现函数返回一个空数组,稍后当异步调用成功时,数组才会被填充。

  2. 在第二个示例中,您只创建了一个变量,然后在异步调用完成之前将其返回。但是异步调用完成后,您将变量分配给一个新值。从而破坏了早期的引用。

解决方案:-虽然不是使其工作的首选方法。您将必须维护类别变量引用。为此,您可以使用 angular.copy或者 angular extend

所以你的代码的第二部分应该是这样的this.getById = function (id) { 变种类别;

        $cordovaSQLite.execute(sqliteHelper.getDb(),
"SELECT * FROM categories WHERE id = ?;", [id])
.then(function (res) {
angular.copy(res.rows[0], category);
//now the reference to the category variable
//will not be lost
});

return category;
}

更好的做法:-您开发此应用程序的方式是错误的。不应以这种方式处理异步调用。我早些时候问了一个问题,只是为了阐明在 Angular 应用程序、工厂和 Controller 中处理异步调用和状态的方式 please have a look here .它提供了两种处理状态和异步调用的方法。那里可能有更多的做法,但这两个最适合我。

关于javascript - 为什么它对数组正确但对对象却不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31155238/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com