$http.success()

几乎所有新手开始学习angular时, 接触到的第一个例子都是双向数据绑定, 紧跟着就是如何使用angular去发一个AJAX请求, 看起来十分简单粗暴.

$http.post('/products', product).success(function(createdProduct) {
    // w00t!
});

如果你不了解JS中的Promise, 阅读阮一峰Promise, 当然Promise并不是这篇文章的大前提, 你只需要知道, .success()和.error()方法都是angular特有的, 普通的promise对象只有.then().

.success()怎么坑了我

也不能说.success()坑了我, 应该是我自己把自己埋到了坑里, 最近公司的angular项目重构, 采用component base 的结构, angular1.5升级到1.6. 跑起来之后有一个第三方插件报错.

TypeError: $http(...).success is not a function

这还不简单? 找到压缩过的代码, 想当然的把success换成了then. 报错没了. 哈哈哈!!! 诶? 等等... 好像哪里不太对的样子, 数据怎么拿不到了.

// We need now to set the image and audio field names
if (response.audioFieldName) {
    config.audioFieldName = response.audioFieldName;
}

if (response.imageFieldName) {
    config.imageFieldName = response.imageFieldName;
}

response里的数据都没了. 清一色的undefined. 好吧. 这才发现success()并不是简单的then()函数的第一个参数. 还有其他的猫腻.

.success()如何实现

在angular源码中, success的实现基本如下

promise.success = function(fn) {
    // ...
    promise.then(function(response) {
        fn(response.data, response.status, response.headers, config);
    });
    return promise;
};

所以它并没有什么, 只是then()的一个语法糖. 解构了response. 把response.data作为第一个参数给返回了, 由于拦截器里返回的数据都在response.data里, 所以直接在response上取, 得到的是undefined.

这下豁然开朗了, 修复这个问题自然不在话下咯, 为了插件对低版本的项目的兼容, 做了如下处理.

if (response.data) {
    response = response.data;
}

写代码还是不能自己感觉该这么写, 该那么写, 该看文档还是得看文档!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文适用的读者 本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,...
    HZ充电大喵阅读 7,333评论 6 19
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,750评论 0 5
  • 1、angularjs的几大特性是什么? 双向数据绑定、依赖注入、模板、指令、MVC/MVVM 2、列举几种常见的...
    2e9a10d418ab阅读 1,398评论 0 10
  • 1、angularjs的几大特性是什么? 双向数据绑定、依赖注入、模板、指令、MVC/MVVM 2、列举几种常见的...
    秀才JaneBook阅读 1,557评论 0 22
  • 亲爱的大发家人们: 大家晚上好,每次学习活法后都有不同的感悟,每一小节的标题都是鼓舞人心的励志语句,虽然...
    徐书成xsc阅读 1,477评论 0 0