$ q.then没有调用回调

时间:2017-03-10 00:35:11

标签: javascript angularjs jasmine

then回调承诺不被调用的可能原因是什么? 例如:

function testPromise() {
  console.log("this gets logged")
  return $q(function(resolve, reject) {
    console.log("this too")
    resolve("test")
    console.log("and this");
    $rootScope.$apply()
    console.log("and this too");
  })
}
testPromise().then(function(result){
  console.log("this never gets logged")
});

我没有看到明显的东西吗?谢谢。

4 个答案:

答案 0 :(得分:0)

这取决于您使用的AngularJS的版本。

在AngularJS 1.2 $q was not a function中,而是要求您创建一个名为“延迟”的东西并单独返回一个承诺。

但是,您应该在控制台中收到错误,告诉您是否是这种情况。

答案 1 :(得分:0)

这完全取决于你从哪里打电话$rootScope.$apply()。如果它在摘要周期的执行期间,则您的调用将导致错误并停止执行脚本。

您的示例在没有$rootScope.$apply()的情况下完美运行。您能否提供更多关于您打算如何使用它的背景信息?

答案 2 :(得分:0)

我希望这会有所帮助。 我想这就是你如何使用$ q。 所以我做了一个有效的例子。

在我的示例中,我在服务中使用$ q并使用$ timeout延迟其响应 我删除了$ apply()我不知道你为什么要用它。

 app.factory('TestingService', TestingService);
  function TestingService($q, $timeout) {
  return {runPromise:runPromise};
    function runPromise() {
        return $q(function(resolve, reject) {
          console.log("inside my $q")
          $timeout(function(){
            resolve("$q is working fine"); 
          }, 2000); //Lets use $timeout, just to see the result
        });
    };
  }

然后

TestingService.runPromise().then(
  function(result){
    console.log('result::',result);
    vm.test = result;
});

https://developer.android.com/guide/components/activities.html#CoordinatingActivities

我希望它有所帮助。

答案 3 :(得分:0)

感谢大家的回答。事实证明,有些人提到它与我调用此函数的位置有关。所以从常规函数调用工作。从另一个then的回调中调用也有效,但是从context.sync().then()调用,其中context.sync()Word Add-in的承诺(谁知道它实际上是什么) - 不。所以我最终将我的函数转换为回调,而不是作为一个承诺。