【问题标题】:Getting "Unknown provider: $qProvider <- $q" when fetching the defer/promise from my AngularJS injector从我的AngularJS注入器获取延迟/承诺时获取“未知提供者:$qProvider <- $q”
【发布时间】:2013-05-03 22:25:14
【问题描述】:

我正在尝试创建一个简单的示例,从 AngularJS 的服务解决方案中获取 promise/defer 对象:

var $q;

function init() {

    var $injector = window.angular.injector();
    console.log($injector);
    $injector.invoke(["$q", function (_$q) {
        console.log($q);
        $q = _$q;
    }]);

}

init();

但结果是:

错误:未知提供者:$qProvider throw Error("未知提供者:" + path.join('

我可能错过了什么?

【问题讨论】:

  • 你是在使用角度世界还是外部角度世界的代码

标签: angularjs promise


【解决方案1】:

您必须像这样添加提供程序所在的模块:

var $injector = window.angular.injector(['ng']);

然后就可以了!

编辑:关于“ng”模块,文档明确表示必须明确添加。 From the angular injector docs:

modules – {Array.<string|Function>} – A list of module functions or their aliases.
See angular.module. The ng module must be explicitly added.

【讨论】:

  • 这取决于注入器是从内部 angular 还是外部 angularjs 调用
  • 外角,我必须提供一个模块吗?如果不定义角度模块,我就无法获得延迟/承诺?只是好奇。
  • 您不必定义自己的模块,'ng' 是 Angular 自己的模块名称,例如$qProvider 已定义。我在浏览器控制台中尝试了这个并且它有效: angular.injector(['ng']).invoke(['$q', function (q) { console.log(q); }]);
  • 我不会很好地工作,因为如果你不引导你的模块,$q 使用 $rootScope 并且 $rootScope 为空。例如,异步承诺永远不会解决。
  • 我没有想到这一点。我看不出不使用模块就使用 Angular 的意义。
【解决方案2】:

如果您在 angular.js 模块生命周期之外,请使用 https://github.com/kriskowal/q,我已经走上了这条路,它不会很好地工作,$q 不打算在引导模块之外使用(需要 $ rootScope)。

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 2015-04-03
    • 2019-04-26
    • 2016-10-25
    • 2014-06-02
    • 2021-04-03
    • 2017-05-08
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多