有什么方法可以知道变量是否是angularjs的承诺?

Seb*_* F. 58 angularjs

我正在制作一个将函数作为范围参数(scope: { method:'&theFunction' })的指令.我需要知道该方法返回的结果是否是一个有角度的承诺(如果有的话会在分辨率上发生,否则会立即发生).

现在我正在测试是否foo.then存在,但我想知道是否有更好的方法来做到这一点.

Dav*_*yon 82

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

这里的文档$q.when$ q.

  • 这个答案肯定会有效,但有一种方法可以知道变量是否是一个angularjs承诺,而不保证它会增加开销和依赖. (3认同)
  • 这似乎是一个绝妙的主意。我会遇到的唯一(次要)问题是它需要为此注入 $q 。 (2认同)

Kay*_*ave 78

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

如果这不符合您的需求,那么Angular的内部检查方式(它在内部使用when)非常接近您正在做的事情:

var ref = function(value) {
   if (value && isFunction(value.then)) {
      // Then this is promise
   }
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这个答案优于Davin Tryon目前接受的答案; 因为问题的语言是"任何方式来知道变量是否是一个angularjs承诺",这个答案显示了如何知道; 接受的答案仅仅是围绕回答问题的必要性. (10认同)
  • 哇,这正是我在做的事情.感谢您在源代码中发现我看了一眼但必须跳过它. (4认同)

Saj*_*han 5

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

角$ 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.
Run Code Online (Sandbox Code Playgroud)
$q.when(value).then(function (data) {
//this helps me to bind data from $resource or $http or object
}
Run Code Online (Sandbox Code Playgroud)

检查这个 小提琴