Javascript 将一个简单的ajax调用转换为使用promise jQuery/AngularJS

Javascript 将一个简单的ajax调用转换为使用promise jQuery/AngularJS,javascript,jquery,ajax,angularjs,promise,Javascript,Jquery,Ajax,Angularjs,Promise,我有一种在应用程序中使用AJAX调用的通用方法: function doAjaxCommand(url, type, async, params, successCallback, failCallback) { $.ajax({ url: url, type: type, async: async, dataType: "json", data: JSON.stringify(params)

我有一种在应用程序中使用AJAX调用的通用方法:

function doAjaxCommand(url, type, async, params, successCallback, failCallback) {
    $.ajax({
        url: url,
        type: type,
        async: async,
        dataType: "json",
        data: JSON.stringify(params)
        contentType: "application/json; charset=utf-8",
        success: function(result) {
            if (result.Success) {
                successCallback(result);
            } else {
                if (failCallback !== undefined) {
                    failCallback(result);
                }
                return false;
            }
        },
        error: function(xhr, status, error) {
            console.log(xhr.responseText);
            console.log(xhr);
            console.log(status);
        }    
    });
}
我听说使用承诺可以更好地利用异步操作。然而,我不知道如何使用承诺。我从来没有使用过它,我也没有在我读到的一些链接中了解到它的全部意思。你们能告诉我一件事吗?甚至如何开始思考


任何帮助都将不胜感激,谢谢

实际上,承诺允许一种更好的方式“组合”回调。常规回调通常会导致“末日金字塔”

    step1(function (value1) {
        step2(value1, function(value2) {
            step3(value2, function(value3) {
              step4(value3, function(value4) {
                // Do something with value4
              });
          });
        });
    });
相反,承诺允许扁平化的呼叫流。例如:使用q.js()我们可以

Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
    // Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
jquery还支持promise样式

var jqxhr = $.getJSON( "example.json", function() {
     console.log( "success" );
})
.done(function() {
    console.log( "second success" );
})
.fail(function() {
    console.log( "error" );
})
.always(function() {
   console.log( "complete" );
});

但是,你应该使用内置的Angularjs承诺。

我发现这是最好的解释Angularjs承诺的方式:

如果您计划定期与后端进行REST交互,我建议您

在angularjs中,如果要使用默认的
$http
,请参考Angular的文档:

 $http({method: 'GET', url: '/someUrl'}).
    success(function(data, status, headers, config) {
      // this callback will be called asynchronously
      // when the response is available
    }).
    error(function(data, status, headers, config) {
      // called asynchronously if an error occurs
      // or server returns response with an error status.
    });
这暴露了承诺
成功
错误
或者你可以

 $http({method: 'GET', url: '/someUrl'}).
    then(function(data, status, headers, config) {
      // this callback will be called asynchronously
      // when the response is available
      $scope.users = response.users;
    })

它公开了当aync完成时的
承诺,然后做一些事情

$.ajax之前添加
return
。就是这样。试着阅读这篇文章,它谈到了如何使用$q库:你几乎肯定不应该将jQuery与Angular一起使用。使用Angular的
$http
服务。呃……在$.ajax`之前放一个
返回
,它已经使用了承诺,你只要用
钩住它们就可以了。然后,
。还有,m59所说的在这里和这里重新描述jQuery的
。完成
。失败
。总是
等都不像Q的承诺“
。然后
或Angular的承诺,因为它们不连锁。相反,你可以将其与jQuery自己的
。然后
@BenjaminGruenbaum同意Q和Angular的承诺更优越是一篇好的文章我只是提到jquery支持承诺“风格”并不是说这些都是符合+承诺的。使用
$http
AngularJS对象的好方法,但是有没有像jQuery Ajax调用那样的
beforeSend
属性?给出了答案。有相关文档。我个人没有使用过
。我自己也没有拦截器,但了解它会很有趣信息技术