javascript - AngularJS 和服务内部的异步函数

标签 javascript angularjs cordova

我在使用异步函数时遇到了这个问题。关键是“执行”不是等待 NotificationService.confirm 回调的返回。

我的意思是,它显示了一个 PhoneGap 警报,但它没有等待评估哪个按钮按下了用户。因此,您可以在控制台输出中看到 undefined 而不是 false/true/3 值

[编辑]

这是 Maxim Shoutin 提出的代码,但它还没有工作:

NotificationController.js

angular.module('app').controller("NotificationController", function($rootScope) {

    $rootScope.cancel_button = function() {
      var confirm = NotificationService.confirm("Do you want to confirm?", 'Yes!');

      confirm.then(function(result) {
        console.log('Confirm: ' + result);
        if(confirm)   $location.path('/menu');
      }, function(result) {
        console.log('No data returned');
      })
    }

   /* Additional controller code... */
}

NotificationService.js

angular.module('app').factory("NotificationService", function() {

  // Callback function
  var onConfirm = function(button) {
    console.log('Callback function called!!!');
    if(button == 1)       return false;
    else if(button == 2)  return true;
    else if(button == 3)  return 3;
    else                  return false; // dismissed without press button
  };

 return {
     confirm : function(alert_msg, title, buttonsArray) {

        var deferred = $q.defer();

        if(buttonsArray == null) {
             buttonsArray = ['Cancel', 'OK'];
        }

         var data = navigator.notification.confirm(
                        alert_msg,      // message
                        onConfirm,      // callback
                        title,          // title
                        buttonsArray    // buttonsArray
                    );

         deferred.resolve(data);
         return deferred.promise;
      }
  }
}

控制台输出

> 确认:未定义(之前用户按下按钮)

> 调用回调函数!!!(AFTER 用户按下按钮)

最佳答案

问题是您要在数据实际返回之前解决 promise 。您需要让您的 onConfirm 函数访问 NotificationService.confirm 正在返回的 promise ,并且只在其中调用 resolve

关于javascript - AngularJS 和服务内部的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20582932/

相关文章:

javascript - 如何将日期时间转换为 mm/dd/yyyy 格式

javascript - 通过 Javascript 从字符串中提取纬度和经度

javascript - 使用 Protractor 测试 HTTP header : (X-)Content-Security-Policy

javascript - 当数据通过 Angularjs 解析到达时如何触发渲染模板

javascript - Angular ui 路由器 - 在没有参数的情况下从一种状态转换到相同状态失败

jquery - 使用显示 :none still produce blank space

javascript - 将 UTC 时间戳解析为本地时间,忽略时区

javascript - 获取文本框的值

android - Cordova 未复制适当的图标和启动画面,使用默认设置,仅限 Android

javascript - 不使用 spritesheet 的 HTML5 动画