由于js是单线程执行,为防止阻塞,会有很多异步回调函数callback,嵌套层次多了,可读性就差了很多。随着社区的发展,出现了promise。我们来将一些常见的回调函数做修改,变成promise的链式调用,简洁,清晰明了。

先理解一点点概念。

每个promise都有三个状态。pending、Fulfilled、Rejected。最初为pending,状态一但改变为Fulfilled、Rejected中的一种,即成永远,不再改变。

pending: 等待状态。

Fulfilled: 表示成功完成。

Rejected: 表示被拒绝,失败。

原生的ajax请求


/**
* 原生请求
*/
function nativeRequest(url) {
var xhr = new XMLHttpRequest()
// 这里我建议的书写顺序是: onreadystatechange -> open -> send
// 这样,onreadystatechange 可以获取 readyState 的状态 1 2 3 4
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) { // 请求已完成,且响应已就绪
if (xhr.status === 200) {
// TODO: 处理返回正常的数据 xhr.responseText
} else {
// TODO: 处理返回非正常的数据
}
}
}
xhr.open('GET', url, true)
xhr.send(null)
}

promise 风格的请求

/**
* promisify request
* 返回promise对象
*/
function promiseRequest(url) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(xhr.responseText)
} else {
reject(xhr.responseText)
}
}
}
xhr.open('GET', xhr, true)
xhr.send(null)
}).catch(err => {
console.log(err)
})
}

jquery中的ajax请求

这里只使用ajax请求中的get请求,使用常见的几个参数。


/**
* ajax get请求
*/
function ajaxResponse(url) {
$.ajax({
url: url,
type: 'GET',
success: res => {
console.log(res)
},
error: err => {
console.log(err)
}
})
}

转换为promise风格

/**
* promise风格的ajax get请求
* 返回promise对象
* 这里同时用到了es6中的解构赋值默认值和函数参数默认值
*/
function promiseAjaxResponse(url, {
type = 'GET',
} = {}) {
return new Promise((resolve, reject) => {
$.ajax({
url,
type,
success: res => {
resolve(res)
},
error: err => {
reject(err)
}
})
})
}

node风格的callback请求


nodeGet(param, function (err, data) { })

TO:


function nodeGetAysnc(param) { return new Promise((resolve, reject) => { nodeGet(param, function (err, data) { if (err !== null) return reject(err) resolve(data) }) }) }

DOM load事件 或者其他一次性事件


function load() { console.log('onload - end') } window.onload = load

TO promise


function promiseLoad() { return new Promise(function (resolve, reject) { window.onload = resolve }) } promiseLoad().then(load)

参考

1.How do I convert an existing callback API to promises?

2.How do I promisify native XHR?

将已经存在的异步请求callback转换为同步promise的更多相关文章

  1. javascript 异步请求封装成同步请求

    此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...

  2. js循环调用axios异步请求,实现同步

    准备: const axios = require('axios'); // axios请求 const res = []; const arr = ["a", "b&q ...

  3. iOS 信号量解决-网络异步请求的数据同步返回问题

    有那么一个场景如下 +PayWithBlock:(NSString*(^)(NSString *message)) block; 如果 block 返回是同步的那是没有问题的,但是如果block 内容 ...

  4. 在递归函数中使用JQuery.Deferred,异步请求中的同步执行...

    标题不知道怎么起合适,其实需求很简单: 黑色背景的容器在页面打开时是隐藏的,点击提交后显示. 然后开始执行递归方法,每次ajax请求完成时,更新容器内容. 在全部执行完成后输出“执行完成”. subm ...

  5. AJAX的来龙去脉(由来)-如何被封装出来的--ajax发送异步请求(四步操作)

    <黑马程序员_超全面的JavaWeb视频教程vedio\JavaWeb视频教程_day23_ajax> \JavaWeb视频教程_day23_ajax\day23ajax_avi\14.打 ...

  6. ASIHTTPRequest取消异步请求

    今天碰到一个问题 异步请求等待中 cancel后会发生什么,网上找了下资料说取消的请求默认都会按请求失败处理,并调用请求失败delegate 查找到的资料具体解释了下ASIHTTPRequest取消异 ...

  7. JavaWeb笔记——ajax异步请求

     1. ajax是什么?   * asynchronous javascript and xml:异步的js和xml   * 它能使用js访问服务器,而且是异步访问   * 服务器给客户端的响应一般是 ...

  8. promise处理多个相互依赖的异步请求

    在项目中,经常会遇到多个相互依赖的异步请求.如有a,b,c三个ajax请求,b需要依赖a返回的数据,c又需要a和b请求返回的数据.如果采用请求嵌套请求的方式自然是不可取的.导致代码难以维护,如何请求很 ...

  9. 【WePY小程序框架实战四】-使用async&await异步请求数据

    [WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...

随机推荐

  1. goroutine的意义与实现

    goroutine的意义与实现 goroutine存在的意义 goroutine是用于实现GO的并发的,而不是并行.此处的并发指的是一套管理.调度.执行goroutine的过程. 并行的性能更高,可以 ...

  2. 安卓上用Termux终端模拟器安装MC Forge 1.12.2服务器!

    本教程重度新手向,大神勿喷(因为楼主本人就是Linux小白)! 为了让教程合乎简约至上的原则,将不在基本操作上赘述 测试环境:酷派大神Note3 Android5.0 2GBRAM 未root 截图是 ...

  3. 优雅的使用git

    1.当我们成功安装git后,首先要做的就是配置我们的用户名以及邮箱: git config --global user.name "xxx" git config --global ...

  4. docker etcd

    etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,用于配置共享和服务发现 etcd内部采用raft协议作为一致性算法,etcd ...

  5. Consul1-window安装consul

    转自  https://blog.csdn.net/j903829182/article/details/80960802 consul下载地址: https://www.consul.io/down ...

  6. [Reinforcement Learning] 强化学习介绍

    随着AlphaGo和AlphaZero的出现,强化学习相关算法在这几年引起了学术界和工业界的重视.最近也翻了很多强化学习的资料,有时间了还是得自己动脑筋整理一下. 强化学习定义 先借用维基百科上对强化 ...

  7. 生成ISO文件

    cat /dev/cdrom > image.iso dd if=/dev/cdrom of=image.iso mkisofs -V "Label" -o image.is ...

  8. 模拟赛20181015 Uva1078 bfs+四维dp

    题意:一张网格图,多组数据,输入n,m,sx,sy,tx,ty大小,起终点 接下来共有2n-1行,奇数行有m-1个数,表示横向的边权,偶数行有m个数,表示纵向的边权 样例输入: 4  4  1  1  ...

  9. 转载:C++中堆和栈的区别

    C++中堆和栈的区别,自由存储区.全局/静态存储区和常量存储区     文章来自一个论坛里的回帖,哪个论坛记不得了!    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和 ...

  10. mac charles手机抓包详细教程

    1.官方下载charles 2.查看电脑IP地址 3.Proxy>Proxy Settings>勾选 Enable transparent HTTP proxying  (记住端口号 88 ...