将已经存在的异步请求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?

原文地址:https://www.cnblogs.com/weiqinl/p/9651515.html

时间: 2024-10-09 00:10:33

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

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

此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 同步任务接入之后,每个任务会进行token的验证,每个任务之间都是同步请求,包括token /** * 同步流请求 * token验证每个接口 * 柯里化添加同步任务 * resolve返回res,cb * reject 返回res,cb * 通过任务中断测试 * 通过成功失败回调函数测试 * *

IOS中get同步异步请求与post同步异步请求

demo //  Created by apple on 15/1/6. //  Copyright (c) 2015年 huweibin. All rights reserved. // #import "ViewController.h" @interface ViewController () @property(nonatomic,strong)UITextView *textView; @property(nonatomic,copy)NSString *BASE_URL;

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

<黑马程序员_超全面的JavaWeb视频教程vedio\JavaWeb视频教程_day23_ajax> \JavaWeb视频教程_day23_ajax\day23ajax_avi\14.打包ajax生成小工具.avi;  有介绍: 个人理解:就是封装了 XMLHttpRequest 的请求方法:演变而成我们常用的 ajax: =====原始的请求方式: ajax发送异步请求(四步操作) 1. 第一步(得到XMLHttpRequest) * ajax其实只需要学习一个对象:XMLHttpRequ

ASIHTTPRequest取消异步请求

今天碰到一个问题 异步请求等待中 cancel后会发生什么,网上找了下资料说取消的请求默认都会按请求失败处理,并调用请求失败delegate 查找到的资料具体解释了下ASIHTTPRequest取消异步请求 首先,同步请求是不能取消的.其次,不管是队列请求,还是简单的异步请求,全部调用[ request cancel ]来取消请求. 取消的请求默认都会按请求失败处理,并调用请求失败delegate.如果不想调用delegate方法,则设置:[ request clearDelegatesAndC

ASIHTTP 框架,同步、 异步请求、 上传 、 下载

ASIHTTPRequest详解 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目.让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度跟踪,上传文件,HTTP 认证.在新的版本中,还加入了 Objective-C 闭包 Block 的支持,让我们的代码加轻简灵活. 下面就举例说明它的 API 用法. 发起一个同步请求 同步意为着线程阻塞,在主线程中使用此方法会使应用Hang住而不响应任何用户事件.所以,在应用程序设计时,大多被用在

ios中的ASIHTTPRequest的同步请求和异步请求

1.首先加入ASI开源库 2. WebImageView.h #import <UIKit/UIKit.h> #import "ASIHTTPRequest.h" @interface WebImageView :UIImageView<ASIHTTPRequestDelegate> - (void)setImageURL:(NSURL *)url; @end WebImageView.m #import "WebImageView.h" #

IOS ---网络异步请求

异步请求使用与同步和队列式异步请求相同的对象,只不过又增加了另一个对象,即NSURLConnectionDelegate: 上代码: #import "ViewController.h" NSInteger totalDownLoaded = 0; @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any ad

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

[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链式then的这种写法壁垒,又让异步请求更像同步,若对async await不太了解的同学可以直接参考阮一峰老师的文章async 函数的含义和用法,这里我们只关注怎么在小程序wepy架构中如何使用. 依赖库 import 'wepy-async-function' app.wpy中启用 export

jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)

1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数. 2.使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数据,并对获取的数据进行解析,显示在页面中,它的