将已经存在的异步请求callback转换为同步promise
由于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的更多相关文章
- javascript 异步请求封装成同步请求
此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...
- js循环调用axios异步请求,实现同步
准备: const axios = require('axios'); // axios请求 const res = []; const arr = ["a", "b&q ...
- iOS 信号量解决-网络异步请求的数据同步返回问题
有那么一个场景如下 +PayWithBlock:(NSString*(^)(NSString *message)) block; 如果 block 返回是同步的那是没有问题的,但是如果block 内容 ...
- 在递归函数中使用JQuery.Deferred,异步请求中的同步执行...
标题不知道怎么起合适,其实需求很简单: 黑色背景的容器在页面打开时是隐藏的,点击提交后显示. 然后开始执行递归方法,每次ajax请求完成时,更新容器内容. 在全部执行完成后输出“执行完成”. subm ...
- AJAX的来龙去脉(由来)-如何被封装出来的--ajax发送异步请求(四步操作)
<黑马程序员_超全面的JavaWeb视频教程vedio\JavaWeb视频教程_day23_ajax> \JavaWeb视频教程_day23_ajax\day23ajax_avi\14.打 ...
- ASIHTTPRequest取消异步请求
今天碰到一个问题 异步请求等待中 cancel后会发生什么,网上找了下资料说取消的请求默认都会按请求失败处理,并调用请求失败delegate 查找到的资料具体解释了下ASIHTTPRequest取消异 ...
- JavaWeb笔记——ajax异步请求
1. ajax是什么? * asynchronous javascript and xml:异步的js和xml * 它能使用js访问服务器,而且是异步访问 * 服务器给客户端的响应一般是 ...
- promise处理多个相互依赖的异步请求
在项目中,经常会遇到多个相互依赖的异步请求.如有a,b,c三个ajax请求,b需要依赖a返回的数据,c又需要a和b请求返回的数据.如果采用请求嵌套请求的方式自然是不可取的.导致代码难以维护,如何请求很 ...
- 【WePY小程序框架实战四】-使用async&await异步请求数据
[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链 ...
随机推荐
- 【dp】 背包问题
问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...
- Linux-网络管理
网络管理 一 基本网络配置 linux操作系统,以太网卡用“eth”表示网卡:序号从零开始eth0代表到系统能够识别的第一个网卡eth1....第2个网卡 查看网卡信息 查看网卡信息 查看当前系统所连 ...
- wireshark 过滤表达式
一.针对wireshark最常用的自然是针对IP地址的过滤.其中有几种情况: (1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包. 表达式为:ip.src == ...
- MVC系统过滤器 OutputCacheAttribute
命名空间: System.Web.Mvc程序集: System.Web.Mvc(在 System.Web.Mvc.dll 中) 一.MVC缓存简介 缓存是将信息(数据或页面)放在内存中以避免频繁的 ...
- json 格式化的时候,日期格式化
public class CustomIsoDateTimeConverter : IsoDateTimeConverter { public CustomIsoDateTimeConverter() ...
- Exp5 MSF基础应用 20164314
一.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,如ms08_067; (成功) 2.一个针对浏览器的攻击,如ms1 ...
- 【尚学堂·Hadoop学习】MapReduce案例1--天气
案例描述 找出每个月气温最高的2天 数据集 -- :: 34c -- :: 38c -- :: 36c -- :: 32c -- :: 37c -- :: 23c -- :: 41c -- :: 27 ...
- P5301 [GXOI/GZOI2019]宝牌一大堆
题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据 ...
- .NET Core----七牛云图片上传
在引用官方的qiniu.core的nuget是总是发生错误,错误如下,所以就在网上找到了一种解决方案,并稍微改进了一番, 以下是引用图: 方法一: 第一步:引用nuge 第二步:新建项目新建控制器视图 ...
- 【原创】大叔经验分享(47)yarn开启日志归集
yarn开启日志归集功能,除了配置之外 yarn.log-aggregation-enable=true 还要检查/tmp/logs目录是否存在以及权限,尤其是在开启kerberos之后,有些目录可能 ...