【问题标题】:Any way to know if a variable is an angularjs promise?有什么方法可以知道变量是否是 angularjs 承诺?
【发布时间】:2013-12-21 21:27:29
【问题描述】:

我正在制作一个将函数作为作用域参数的指令 (scope: { method:'&theFunction' })。我需要知道该方法返回的结果是否是一个角度承诺(如果是的话,解决方案会发生一些事情,否则它会立即发生)。

现在我正在测试foo.then 是否存在,但我想知道是否有更好的方法。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    您可以使用$q.when 将对象包装为一个promise(无论它是否存在)。然后,你可以确定你总是在处理一个承诺。这应该会简化处理结果的代码。

    $q.when 的文档是 here with $q

    【讨论】:

    • 这似乎是个好主意。我会遇到的唯一(次要)问题是它需要为此注入 $q。
    • 在这种情况下,您可以这样做,以便您调用的方法始终返回一个承诺。 (同样,通过使用$q.when。然后任何调用者都会知道期待一个承诺。
    • 我仍然更喜欢依赖 $q 而不是“强制”函数返回一个承诺。感谢您的帮助。
    • 这个答案肯定会奏效,但是有一种方法可以知道一个变量是否是一个 angularjs 承诺,而不保证它会通过增加开销和依赖项来保证。
    • 很好的提示,但不是原始问题的答案。
    【解决方案2】:

    正如 Davin 所说,Angular 的 when() 是一个不错的选择。

    如果这不能满足您的需求,那么 Angular 的 internal way of checking(它在 when 中使用它)非常接近您正在做的事情:

    var ref = function(value) {
       if (value && isFunction(value.then)) {
          // Then this is promise
       }
    

    【讨论】:

    • 哇,这正是我正在做的事情。感谢您在源代码中找到它,我看了一下,但肯定跳过了。
    • 在我看来,这个答案优于 Davin Tryon 目前接受的答案;因为问题的语言是“知道变量是否是 angularjs 承诺的任何方式”,而这个答案确切地显示了如何知道;接受的答案仅适用于回答问题的需要。
    • 虽然(半)重要的是要注意,这实际上并不是检查对象是否是一个承诺,而是检查对象是否具有 then 属性,而该属性恰好是一个函数。跨度>
    • 实际检查更像:(isObject(value) || isFunction(value)) && isFunction(value.then)
    • 如果不想自己写isFunction函数,Lodash和Underscore各有各的版本
    【解决方案3】:

    @kayakDave,感谢您指导正确的地方。

    angular $q

    when(value, [successCallback], [errorCallback], [progressCallback]);
                Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. 
                This is useful when you are dealing with an object that might  or might not be a promise, 
                or if the promise comes from a source that can't be trusted.
    
    $q.when(value).then(function (data) {
    //this helps me to bind data from $resource or $http or object
    }
    

    检查这个fiddle

    【讨论】:

    • 我不确定您的答案与原始问题的相关性如何。你能详细说明一下吗?
    【解决方案4】:

    $q.when() 答案似乎是大多数用例的最佳答案,我使用 instanceof 作为我的答案。

        if(buttonData instanceof $q) {
            buttonData.then(function(actions) {
                $scope.buttonActions = actions;
            });
        } else {
            $scope.button = buttonData;
        }
    

    或者,以下 IF 也可以,但我最终选择了上述解决方案。

    if(Object.getPrototypeOf(buttonData) === $q.prototype) {

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 2013-01-13
      • 2012-05-30
      • 2015-07-25
      相关资源
      最近更新 更多