Javascript / AngularJS - 等待回调完成执行

时间:2014-06-09 03:23:19

标签: javascript angularjs deferred-execution

我有一个名为Progress的服务,其中一个名为confirmation的方法需要Progress.confirmation(message, accepted, rejected);

到目前为止,功能是:

if (!_.isString(message)) {
    console.warn('No confirmation message was provided');
    return false;
}

$rootScope.confirmation.message = message;
$('#confirmation').foundation('reveal', 'open');

// User confirms. If accepted() is provided, then run it
$rootScope.confirmationAccept = function() {
    if (_.isFunction(accepted)) accepted();
    $('#confirmation').foundation('reveal', 'close');
};

// User confirms. If rejected() is provided, then run it
$rootScope.confirmationReject = function() {
    if (_.isFunction(rejected)) rejected();
    $('#confirmation').foundation('reveal', 'close');
};

两个函数$rootScope.confirmationAccept()$rootScope.confirmationReject()只是确认显示页面中的检查/取消按钮。

我想要做的是在关闭显示页面之前等待accepted() / rejected()执行。我怎样才能做到这一点?

由于我通过了这两个功能,我真的不能确保编码人员会记得使用$q延迟,所以我不认为这是一个选项吗?另外,我不能相信回调会返回一个值,所以我不能等待/观察返回的值。

由于

2 个答案:

答案 0 :(得分:0)

您是否可以使用$broadcast来监听更改?

答案 1 :(得分:0)

你的要求并不是很清楚。

这确实应该是一个指令。您上面的确认模式案例应该直截了当地制定指令,这样您就不会有魔法操纵或根源污染。

通常,您会将此逻辑封装在如下指令中:

<confirm-modal open="confirmationOpen" success="successCb()" abort="abortedCb" custom-message="'myCustomMessage'">
<button ng-click="launchConfirmation()">Click me or launch from controller</button>

这使您的控制器可以管理状态。

$scope.launchConfirmation() {
  $scope.confirmationOpen = true;
}

$scope.successCb() {
  //They Confirmed
  //Do Async stuff
  myAsync().then(function() {
    $scope.confirmationOpen = false;
  });
}

$scope.abortCb = function() {
  //nothing async here
  reset();
  $scope.confirmationOpen = false;
};