jquery - 我可以将 jQuery.ajax 与 Angular JS Promise api 一起使用吗?

标签 jquery cordova angularjs

我在 angular.service 中有一个 ajax 函数,用于根据后端服务检查用户的凭据。我已经简化了很多调用。当我使用 $http 服务发出 AJAX 请求时,promise API 工作正常:

function isOnline(){
    return $http.get(constants.dataUrl)
           .success(function(){return})
           .error(function(){return;});
}
function checkCredentials(){
    var online = isOnline();
    var checkCreds = online.then(function(){
        alert("Get succeeded");
    },
    function(response){
        alert("Get did not succeed");
    });
    return checkCreds;
}  

我看到 then 中定义的函数被调用。但是,当我使用 jQuery ajax 方法时,resolve 和 defer 方法似乎没有在 online.then 中传播和触发正确的方法。下面的代码不起作用:

function isOnline(){
    var defer = $q.defer();

    $.ajax({
      url: constants.dataUrl,
      dataType: 'json',
      beforeSend: function (xhr) {
        xhr.setRequestHeader('Authorization', basicAuthenticationToken());
      },
      error: function (xhr, ajaxOptions, thrownError) {
        alert("I am not online");
        defer.reject("I am not online");
      },
      success: function (data) {
        alert("I am online");
        defer.resolve(data);
      }
    });

    return defer.promise;
}
function checkCredentials(){
    var online = isOnline();
    var checkCreds = online.then(function(){
        alert("Get succeeded");
    },
    function(response){
        alert("Get did not succeed");
    });
    return checkCreds;
} 

我可以不将 Promise API 与普通的 jQuery ajax 方法一起使用吗?我想替换这些调用的原因与复杂的 PhoneGap 场景有关,该场景似乎不适用于 Angular $http。

最佳答案

Angularjs 需要收到外部发生的更改的通知。由于 ajax 事件是由 jquery 处理的,因此您需要执行 apply。取决于您的函数所在的位置(可能是 $scope 或 $rootScope)

defer.reject("I am not online");
$scope.$apply();

....
defer.resolve(data);
$scope.$apply();

这将使 Angular 知道重新处理自身。以下是有关它的文档:http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply

只要您必须在 Angular 之外编写 JavaScript,但需要将其连接到 Angular 中,您就可以使用此功能。

关于jquery - 我可以将 jQuery.ajax 与 Angular JS Promise api 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962334/

相关文章:

javascript - Bootstrap 选项卡标题元素中的复杂 html

javascript - 来自 InAppBrowser 的返回变量

ios - Ionic 1 应用程序 - 尝试从 Cordova dataDirectory 提供图像文件

angularjs - 使用npm Protractor webdriver-manager在其他端口启动Selenium服务器

javascript - 正在传递 ng-click 中必需的 $event

javascript - 在 jquery 的 mouseout 事件上关闭所有 Accordion

jquery - 操作除当前单击的元素之外的所有元素

jquery - 如何在提交时调用函数?

node.js - cordova build 命令失败,退出代码 EACCES

angularjs - Ul LI 与 AngularJs 绑定(bind)