You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS+Chrome应用:如何从IndexedDB Promise返回数据而非Promise对象?

解决AngularJS中IndexedDB Promise返回结果而非Promise对象的问题

兄弟,我太懂你刚接触AngularJS+IndexedDB时的这种困惑了——Promise的异步特性确实容易让人踩坑,你现在的问题核心就是异步操作没法同步拿到结果,咱们一步步来改:

问题根源分析

你在factory.allCategories里试图用val同步接收Promise的结果,但dbPromise.then()本身返回的就是一个Promise,val最终存的还是Promise对象,而不是异步完成后的分类数组。另外控制器里的var cat = database.allCategories().then(...),then()返回的依然是Promise,所以console.log(cat)打出来肯定是Promise。

修正步骤

1. 简化Factory代码,直接返回Promise

不用中间变量val,让allCategories直接返回整个Promise链,这样外部就能通过then()获取实际结果:

app.factory('database', function(){
  var factory = {};
  factory.allCategories = function(){
    // 直接返回Promise链,不用额外赋值
    return dbPromise.then(db => {
      return db.transaction('category')
        .objectStore('category').getAll();
    });
    // 这里不需要额外的then返回allObjs,因为上面的getAll()已经返回Promise,会自动传递结果
  }
  return factory;
});

2. 控制器中正确处理Promise结果

在控制器里,你需要在then()回调里拿到实际的分类数组,而不是直接赋值给变量:

app.controller('catalogController', function($scope, database){
  // 调用方法后,在then里处理结果
  database.allCategories().then(function(allObjs){
    $scope.categories = allObjs; // 把结果绑定到作用域,供页面使用
    console.log(allObjs); // 这里就能打印出实际的分类数组了
  }).catch(function(err){
    // 别忘了加错误处理,调试更方便
    console.error('获取分类失败:', err);
  });
});

可选:用async/await简化代码(AngularJS 1.6+支持)

如果你的AngularJS版本是1.6及以上,也可以用async/await让代码更像同步写法:

app.controller('catalogController', async function($scope, database){
  try {
    const allObjs = await database.allCategories();
    $scope.categories = allObjs;
    console.log(allObjs);
  } catch(err) {
    console.error('获取分类失败:', err);
  }
  // 注意:async函数里修改$scope后可能需要手动调用$scope.$apply(),如果Angular没自动检测到变化
  // $scope.$apply();
});

关键知识点提醒

  • Promise是异步操作的容器,永远不可能同步拿到它的结果,必须通过then()或者await来获取异步完成后的数据。
  • 所有基于Promise的异步操作(比如idb库的方法),返回的都是Promise,需要链式调用或者await处理。

内容的提问来源于stack exchange,提问作者anees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 08:52:35