Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AngularJS工厂从Parse.com获取数据_Javascript_Angularjs_Parse Platform_Angularjs Factory - Fatal编程技术网

Javascript 使用AngularJS工厂从Parse.com获取数据

Javascript 使用AngularJS工厂从Parse.com获取数据,javascript,angularjs,parse-platform,angularjs-factory,Javascript,Angularjs,Parse Platform,Angularjs Factory,我正在使用(v1.6.7)和(v2.3.3)开发一个电子商务web应用程序 我在Parse Server中创建了类别和产品类。我正试图从每一个类别中获取一定数量的产品 例如,在主页中,每个类别将检索20种产品。其他页面中的产品数量会发生变化 我想使用一个工厂来实现这一点,它获取任何类别中给定数量的产品(产品的数量和类别将作为参数传递给函数)。所以我可以在其他控制器中重用它 ProductsFactory工厂: sebetimapp.factory('ProductsFactory', ['$q'

我正在使用(v1.6.7)和(v2.3.3)开发一个电子商务web应用程序

我在Parse Server中创建了类别产品类。我正试图从每一个类别中获取一定数量的产品

例如,在主页中,每个类别将检索20种产品。其他页面中的产品数量会发生变化

我想使用一个工厂来实现这一点,它获取任何类别中给定数量的产品(产品的数量和类别将作为参数传递给函数)。所以我可以在其他控制器中重用它

ProductsFactory
工厂:

sebetimapp.factory('ProductsFactory', ['$q', function($q){
    Parse.initialize('MY_APP_ID', 'JS_KEY');
    Parse.serverURL = 'https://parseapi.back4app.com/';

    let fac = {};

    fac.getProducts = function(cat, lmt) {
        let Category = Parse.Object.extend('Category'),
            qr = new Parse.Query(Category);

        qr.get(cat, {
            success: function (res) {
                let product_dfd = $q.defer(),
                    Product = Parse.Object.extend('Product'),
                    query = new Parse.Query(Product);

                query.include('category');

                query.equalTo('category', res);

                if (lmt) {
                    query.limit(lmt);
                }

                query.find({
                    success: function(results) {
                        product_dfd.resolve(results);
                    },
                    error: function(err) {
                        product_dfd.reject(results);
                    }
                });

                return product_dfd.promise;
            },
            error: function(object, error) {
                //
            }
        });
    };

    return fac;
}]);
productsCtrl
控制器:

sebetimapp.controller('productsCtrl', ['$scope', '$log', '$location', '$q', 'ProductsFactory', function($scope, $log, $location, $q, ProductsFactory) {
    let params = $location.search(); // To grab category ID from URL.

    ProductsFactory.getProducts(params.cat, 20).then(function(response) {
        $log.log('Successfully retrieved products.');
    }, function(error) {
        $log.log('Unable to get products.');
    });
}]);
当我执行它时,会发生一个错误:

TypeError:无法读取未定义的属性“then”

但是如果我不使用这个工厂并在控制器中定义
getProducts()
函数,它就可以正常工作

为什么会这样?我是新来的。任何帮助都将不胜感激。

then()方法仅在上可用。您的函数似乎没有返回任何内容(因此,
.then()
不可用)

这可能有助于:

sebetimapp.factory('ProductsFactory',['$q',function$q){
初始化('MY_APP_ID','JS_KEY');
Parse.serverURL=https://parseapi.back4app.com/';
var fac={};
fac.getProducts=功能(cat、lmt){
var Category=Parse.Object.extend('Category'),
qr=新解析查询(类别);
返回qr.get(cat)
.然后(功能(res){
var Product=Parse.Object.extend('Product'),
query=新的Parse.query(产品);
查询。包括('category');
query.equalTo('category',res);
如果(lmt){
查询限制(lmt);
}
返回query.find();
});
};
返回fac;

}]);
您正在内部函数中创建并返回
$q
承诺,而不是
getProducts
。还可以想象Parse已经尝试了您的第一个代码片段,并且成功了。为什么它比第二个更好?第一个可能更干净,更可读,因为它只使用承诺。将承诺与回调模式混合通常会创建难以读取/推理的代码库。为了保持一致性,最好只遵守承诺或只使用回调。此外,承诺将是更好的选择,因为它们是为应对“回调地狱”而发明的。我建议阅读承诺并正确使用它们(我可以保证,了解它们使我的代码更加简洁)