【问题标题】:Return value after asynchronou IndexedDb call is finished in function in angularJS (custom filter)在angularJS(自定义过滤器)中的函数中完成异步IndexedDb调用后的返回值
【发布时间】:2016-02-18 10:44:18
【问题描述】:

我编写了我的自定义 AngularJS 过滤器,它应该将 id 转换为 name,它将从 IndexedDb 中获取。 我写了这个过滤器:

cardsList.filter('getCollectionName', ['IndexedDb', function(IndexedDb) {
return function(idCollection) {
    var val = 'not';
    IndexedDb.getById(IndexedDb.STORES.COLLECTION_STORE, idCollection).then(function(data) {
        val = data.name;    //here dont work return data.name;
    }, function(err){
        $window.alert(err);
    });
   return val; // here is still 'not'
};  }]);

所以我有属性 val,我想用 id 的集合名称来设置它。但它的返回初始值'不是'。 我知道内部调用是不可见的属性 val。但返回 data.name;内部成功回调不起作用。 我查看了How do I return the response from an asynchronous call?,但我不明白如何解决我的问题。 如何解决此问题,以便函数从回调中返回 data.name?谢谢

【问题讨论】:

    标签: javascript angularjs asynchronous return-value indexeddb


    【解决方案1】:

    您可以使用 angularjs 的 $q 服务。 当你的承诺在 $q.all(..) 中解决时返回值

    cardsList.filter('getCollectionName', ['IndexedDb','$q', function(IndexedDb,$q) {
    return function(idCollection) {
        var val = 'not';
        var promises=[];
        promises.push(IndexedDb.getById(IndexedDb.STORES.COLLECTION_STORE,idCollection).then(function(data) {
             val = data.name;    //here dont work return data.name;
             }, function(err){
               $window.alert(err);
            })
        );
    
    
        $q.all(promises).then(function(){return val;});
    };  }]);
    

    【讨论】:

    • 它看起来不错,但是如果我像这样编辑我的代码。过滤器不起作用(不要用 return val 替换 idCollection。我需要从 ' this: return function(idCollection) { ' 函数返回该值。如果我这样做 var pom = $q.all(promises).then(... 那么我在 var pom: 具有该值的 Promise 对象,但我不知道如何访问 Promise->$$state->value(chrome 中的控制台登录)
    • 为什么我需要 $q.all()?它只推动一个承诺。
    • 这就像你在等待多个 promise,你可以将它们推送到 promises 数组中并且 $q.all 等待所有的 promise。
    • 对于您上面的评论,为什么不尝试使用简单的功能,而不是过滤器。
    • 因为我使用 ng-repeat 在模板中打印数据,并且对于我访问 collectionId 的项目。从那里我需要得到集合的名称。所以我认为过滤器适合这种情况?但我不知道如何从该承诺中获取/返回价值。当我只在一个地方需要这些信息时,我不会将收藏信息存储到这个项目中。
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多