概述

为了体验promise的原理,我打算自己把ajax包装成promise的形式。主要希望实现下列功能:

// 1.使用success和error进行链式调用,并且可以在后面加上无限个
promise.get(myUrl).success(successCallback1).error(errorCallback1).success(successCallback2).error(errorCallback2).error(errorCallback3).success(successCallback3); // 2.支持同时调用多个myUrl,这个时候需要最后的http请求返回之后才执行回调。
promise.get(myUrl1).success(successCallback1).get(myUrl2).error(errorCallback1).get(myUrl3).error(errorCallback2).success(successCallback1); // 3.支持post和jsonp请求。

对于ajax我选用jq的ajax,但是尽量不使用jq的deferred对象。

本篇博文完成功能1,其它功能在其它博文完成。

功能一

初看功能一,我们有如下思路

  1. 建立一个构造函数,它的原型方法有get(发出get请求),success(挂载成功函数回调),error(挂载失败函数回调);
  2. 这个构造函数有一个原型对象,来分别储存成功和失败的回调函数。
  3. get请求里面发出ajax,并依次执行原型对象的成功和失败回调函数。
let Promise = function() {
this.eventName = {
success: [],
error: []
};
}; Promise.prototype.success = function(cb) {
this.eventName.success.push(cb);
return this;
}; Promise.prototype.error = function(cb) {
this.eventName.error.push(cb);
return this;
}; Promise.prototype.get = function(url) {
let that = this;
$.ajax({
url: url,
type: 'get',
timeout: 5000,
success: function (data, status) {
let successList = that.eventName.success;
if(successList || successList.length) {
for(let i = 0; i < successList.length; i++) {
successList[i](data, status);
}
}
},
error: function (err, status) {
let errorList = that.eventName.error;
if(errorList || errorList.length) {
for(let i = 0; i < errorList.length; i++) {
errorList[i](err, status);
}
}
}
});
return this;
};

然后我们可以执行:

let successCallback1 = (data, status) => {
console.log(data);
} let successCallback2 = (data, status) => {
console.log(data);
} let errorCallback1 = (err, status) => {
console.log(data);
} let errorCallback2 = (err, status) => {
console.log(data);
} let url = 'xxxxxxxxxx';
let promise = new Promise();
promise.success(successCallback1)
.error(errorCallback1)
.error(errorCallback2)
.success(successCallback2)
.get(url);

但是这样有一个缺点,就是get方法只能在最后调用,不能提到前面来。

怎么提到前面来变成下面的调用形式呢?

promise.get(url)
.success(successCallback1)
.error(errorCallback1)
.error(errorCallback2)
.success(successCallback2);

思考可以用setTimeout,测试代码如下:

var Haha = function() {
this.a = [];
}; Haha.prototype.go = function() {
setTimeout(() => {
this.a.push(1);
let that = this;
setTimeout(() => {
that.a.push(2);
});
});
return this;
}; Haha.prototype.push = function(ele) {
this.a.push(ele);
return this;
}; var yaya = new Haha(); yaya.go().push(3).push(4);
// 过一段时间再打印yaya.a,可以看到输出[3, 4, 1, 2]

所以类似的,我们可以把get方法修改如下:

Promise.prototype.get = function() {
setTimeout(() => {
let that = this;
$.ajax({
url: myUrl,
type: 'get',
timeout: 5000,
success: function (data, status) {
let successList = that.eventName.success;
if(successList || successList.length) {
for(let i = 0; i < successList.length; i++) {
successList[i](data, status);
}
}
},
error: function (err, status) {
let errorList = that.eventName.error;
if(errorList || errorList.length) {
for(let i = 0; i < errorList.length; i++) {
errorList[i](err, status);
}
}
}
});
}, 0);
return this;
}

目测可行,之后找个时间测试一下。

把ajax包装成promise的形式(1)的更多相关文章

  1. 把ajax包装成promise的形式(3)

    概述 为了体验promise的原理,我打算自己把ajax包装成promise的形式.主要希望实现下列功能: // 1.使用success和error进行链式调用,并且可以在后面加上无限个 promis ...

  2. 把ajax包装成promise的形式(2)

    概述 为了体验promise的原理,我打算自己把ajax包装成promise的形式.主要希望实现下列功能: // 1.使用success和error进行链式调用,并且可以在后面加上无限个 promis ...

  3. 如何把 Callback 接口包装成 Promise 接口

    最近一段时间一直在看Node.js,在开发过程中经常要调用一些异步接口,通常在接口的最后一个参数会传入一个回调函数,可以用来处理异常,非异常情况.大致模式如下: var fs = require(“f ...

  4. Finder Item脚本如何包装成 Mac App

    第一步,包装 记得之前把一个 java 程序的 jar 包 用 automator包装成了 app, 但自己找不到做法了.回头我想了想 这么实验可行. 这样做成 app 后保存在 /Applicati ...

  5. (转)Groupon前传:从10个月的失败作品修改,1个月找到成功 并不挶泥在这个点子上面,它反而往后站一步,看看他们已经做好的这个网站,可以再怎么包装成另一个完完全全不同的网站?所有的人所做的每件失败的事情中, 一定有碰到或含有成功的答案」在里面,只是他们不知道而已。 人不怕失败」,只怕宣布失败」

    (转)Groupon前传:从10个月的失败作品修改,1个月找到成功 今天读到 一个非常励志人心的故事 ,就像现在「叶问」有「前传」,最近很火红的团集购网站Groupon 也出现了「Groupon前传」 ...

  6. SIP:用Riverbank的SIP创建C++库的Python模块(把自己的C++库包装成Python模块)

    我们发现PyQt做的Python版的PyQt是如此好用,如果想把自己的C++库包装成Python模块该如何实现呢? 这里介绍下用SIP包装C++库时值得参考的功能实现: 需要Python模块中实现C+ ...

  7. [Python] 将视频转成ASCII符号形式、生成GIF图片

    一.简要说明 简述:本文主要展示将视频转成ASCII符号形式展示出来,带音频. 运行环境:Win10/Python3.5. 主要模块: PIL.numpy.shutil. [PIL]: 图像处理 [n ...

  8. 安卓、ios时间转换成时间戳的形式

    将日期转换成时间戳的形式,在安卓和ios不同的系统下转正会有兼容性的问题 安卓系统下Date.parse(new Date('2018-03-30 12:00:00'))会直接转换成时间戳的形式(简单 ...

  9. Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

    转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: ...

随机推荐

  1. Python调用Linux bash命令

    import subprocess as sup  # 以下注释很多(为了自己以后不忘), 如果只是想在python中执行Linux命令, 看前5行就够了 # 3.5版本之后官方推荐使用sup.run ...

  2. 解决build workspace 缓慢的问题

    (1).解决方法         方法1.修改eclipse启动文件 eclipse.ini 中添加启动参数参数: -vmargs -Xmx512m         方法2.关闭自动构建工作区: pr ...

  3. No rule to make target '/usr/lib/x86_64-linux-gnu/libproj.so ,needed by '../bin/generate_pointcloud解决方法

    这是/usr/lib/x86_64-linux-gnu/文件夹内没有这个libproj.so 库,先在该文件夹内搜索是否有同名不同版本的库,如果有 ,可以使用ln -s在该文件夹内部对存在的库链接到一 ...

  4. 得到一个文件夹中所有文件的名称的几个方法(命令指示符, C++, python)

    因为最近一直需要获得一个文件下的所有图片的名称,自己又总是跨平台使用,所以把自己在不同环境之下使用的方法总结如下 1.cmd 模式下 优点:简单 例如,我想将一个文件夹下的所有".jpg&q ...

  5. python语法之函数1

    函数 计算机中的函数和数学中的函数不是一回事,而是一个subroutine .子程序.procedures.过程. 作用: 1.减少重复代码: 2.方便修改,更易扩展: 3.保持代码的一致性. 最简单 ...

  6. 开发HR人事考试系统介绍

    确定好需要开发的模块以及功能 一套人事考试系统主要模块: 1)组织管理:公司部门成员信息 2)人事管理:人事信息,离职管理,职务管理,岗位管理: 3)考勤管理:班次设置,停工放假,假日设置,刷卡记录, ...

  7. 使用kbmMWConfiguration 让 kbmmw smartservice 更聪明

    以前的文章介绍了 很多 kbmmw smartservice 的使用,尤其是 rest 服务,所有的的配置都是通过 开发时写编码实现的,这样就可能导致,针对不同的应用环境,我们要重新编译代码,当然也可 ...

  8. tomcat与iis公用80端口(已经发布.net项目现在开发Java项目时tomcat在eclipse中localhost:8080打不开问题)

    在开发过.net项目的电脑上安装eclipse配置tomcat运行时打不开页面问题描述,这也是本人亲生经历,找了好多资料网上大多都是tomcat配置问题描述,今天突然想到是不是IIS的问题,果然上网一 ...

  9. pointer-events: none 的两个应用场景

    简介 pointer-events: none 真是个神奇的属性. 该属性有什么用?借用 CSS3 pointer-events:none 应用举例及扩展 的总结来说: pointer-events: ...

  10. 基于SVG.js实现网页初始化线条描绘效果

    前端实现看到一个网页的效果很cool(参考https://tympanus.net/Development/SVGDrawingAnimation/index2.html),决定自己去实现以下这个效果 ...