1、回调

  什么是回调?

  个人理解,让函数有序的执行。

  示例:

  function loadScript(src,callback){

    let script = document.createElement('script');

    script.src = src;

    script.onload =()=>calllback(script);

    document.head.append(script);

  }

  loadScript('src',script=>{

    alert('ok');

  });

  也可以在回调函数中继续回调,但是这样会导致回调金字塔,或者地狱。

2、Promise

  Promise 对象的构造语法

  let promise = new Promise(function(resolve,reject){

    //executror

  });

  promise 对象有内部属性

  state -----最初是 pending,然后被改为‘fulfilled“ 或”rejected“

  result -----一个任意值,最初是undefined

  当executor 完成任务时,应用调用下列之一

  消费者:”.then“ 和”.catch"

  promise 对象充当生产者,和消费函数之间的连接。

  .then 的语法;

  promise.then(

    function(result){}

    function(error){}

  );

  示例:

  let promise = new Promise(function(resolve,reject){

    setTimeout(()=>resolve("done"),1000);

  });

  promise.then(

    result=>alert(result),

    error=>alert(error)

  );

    其中成功和失败也可以只选其一,操作如下

  只对成功的进行操作;

  let promise = new Promise(resolve=>resolve("done!"));

  promise.then(alert);

  对错误有两种操作

  let promise = new Promise((resolve,reject)=>{

    setTimeout(()=>reject(new Error("cuole!")),1000);

  });

  promise.then(null,alert);

  简写:promise.catch(alert);

  实践

  function loadScript(src){

    return new Promise(function(resolve,reject){

      let script  document.createElement('script');

      script.src = src;

      script.onload=()=>resolve(script);

      script.onerror=()=>reject(new Error("Script load error: " + src));

      document.head.append(script);

    });

  }

  let promise = loadScript('src');

  promise.then(

    script=>alert(`${script.src} is loaded!`),

    error=>alert(`Error:${error.message}`)

  );

  promise.then(script=>alert('one more handler to do something');

3、Promises 链

  示例:

  1. new Promise(function(resolve, reject) {
  2.  
  3. setTimeout(() => resolve(), ); // (*)
  4.  
  5. }).then(function(result) { // (**)
  6.  
  7. alert(result); //
  8. return result * ;
  9.  
  10. }).then(function(result) { // (***)
  11.  
  12. alert(result); //
  13. return result * ;
  14.  
  15. }).then(function(result) {
  16.  
  17. alert(result); //
  18. return result * ;
  19.  
  20. });

.then 返回的是promises

  1. new Promise(function(resolve, reject) {
  2.  
  3. setTimeout(() => resolve(), );
  4.  
  5. }).then(function(result) {
  6.  
  7. alert(result); //
  8.  
  9. return new Promise((resolve, reject) => { // (*)
  10. setTimeout(() => resolve(result * ), );
  11. });
  12.  
  13. }).then(function(result) { // (**)
  14.  
  15. alert(result); //
  16.  
  17. return new Promise((resolve, reject) => {
  18. setTimeout(() => resolve(result * ), );
  19. });
  20.  
  21. }).then(function(result) {
  22.  
  23. alert(result); //
  24.  
  25. });

这里第一个 .then 显示 1 并在 (*) 行返回 new Promise(…),一秒之后它会 resolve 掉,然后 result(resolve 的参数,在这里它是 result*2)被传递给位于 (**) 行的第二个 .then。它会显示 2,而且执行相同的动作。

所以输出还是 1 → 2 → 4,但是现在每次 alert 调用之间会有 1 秒钟的延迟。

 示例 loadScript

  1. loadScript("/article/promise-chaining/one.js")
  2. .then(script => loadScript("/article/promise-chaining/two.js"))
  3. .then(script => loadScript("/article/promise-chaining/three.js"))
  4. .then(script => {
  5. // 脚本被加载,我们可以使用声明过的函数了
  6. one();
  7. two();
  8. three();
  9. });

  示例 fetch

  基本语法: let promise = fetch(url);

  

  1. function loadJson(url) {
  2. return fetch(url)
  3. .then(response => response.json());
  4. }
  5.  
  6. function loadGithubUser(name) {
  7. return fetch(`https://api.github.com/users/${name}`)
  8. .then(response => response.json());
  9. }
  10.  
  11. function showAvatar(githubUser) {
  12. return new Promise(function(resolve, reject) {
  13. let img = document.createElement('img');
  14. img.src = githubUser.avatar_url;
  15. img.className = "promise-avatar-example";
  16. document.body.append(img);
  17.  
  18. setTimeout(() => {
  19. img.remove();
  20. resolve(githubUser);
  21. }, );
  22. });
  23. }
  24.  
  25. // 使用它们
  26. loadJson('/article/promise-chaining/user.json')
  27. .then(user => loadGithubUser(user.name))
  28. .then(showAvatar)
  29. .then(githubUser => alert(`Finished showing ${githubUser.name}`));
  30. // ...

4、Promise API

  在Promise 类中,有5种静态方法。如下

  Promise.resolve

  语法:let promise = Promise.resolve(value);

  

  1. function loadCached(url) {
  2. let cache = loadCached.cache || (loadCached.cache = new Map());
  3.  
  4. if (cache.has(url)) {
  5. return Promise.resolve(cache.get(url)); // (*)
  6. }
  7.  
  8. return fetch(url)
  9. .then(response => response.text())
  10. .then(text => {
  11. cache.set(url,text);
  12. return text;
  13. });
  14. }

  Promise.reject

  语法: let promise = Promise.reject(error);

  let promise = new Promise((resolve, reject) => reject(error));

  Promise.all

  let promise = Promise.all([...promises...]);

  1. Promise.all([
  2. new Promise(resolve => setTimeout(() => resolve(), )), //
  3. new Promise(resolve => setTimeout(() => resolve(), )), //
  4. new Promise(resolve => setTimeout(() => resolve(), )) //
  5. ]).then(alert); // 1,2,3 当 promise 就绪:每一个 promise 即成为数组中的一员

  Promise.allSettled

  

  1. let urls = [
  2. 'https://api.github.com/users/iliakan',
  3. 'https://api.github.com/users/remy',
  4. 'https://no-such-url'
  5. ];
  6.  
  7. Promise.allSettled(urls.map(url => fetch(url)))
  8. .then(results => { // (*)
  9. results.forEach((result, num) => {
  10. if (result.status == "fulfilled") {
  11. alert(`${urls[num]}: ${result.value.status}`);
  12. }
  13. if (result.status == "rejected") {
  14. alert(`${urls[num]}: ${result.reason}`);
  15. }
  16. });
  17. });

  Promise.race

  语法:let promise = Promise.race(iterable); 

  1. Promise.race([
  2. new Promise((resolve, reject) => setTimeout(() => resolve(), )),
  3. new Promise((resolve, reject) => setTimeout(() => reject(new Error("Whoops!")), )),
  4. new Promise((resolve, reject) => setTimeout(() => resolve(), ))
  5. ]).then(alert); //

第一个结果/错误会成为整个 Promise.race 的结果。在第一个 promise 被解决(“赢得比赛[wins the race]”)后,所有后面的结果/错误都会被忽略。

5、Async/await

  Async functions

  async fucntion f(){

    return 1;
  }

  f().then(alert);//1

  async 确保函数返回值是一个promise。

  Await

  语法:let value = await promise;

  要求:await 不能在普通方法中使用,必须在 async 函数中才有效。

  

  1. async function showAvatar() {
  2.  
  3. // 读取 JSON
  4. let response = await fetch('/article/promise-chaining/user.json');
  5. let user = await response.json();
  6.  
  7. // 读取 github 用户信息
  8. let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
  9. let githubUser = await githubResponse.json();
  10.  
  11. // 显示头像
  12. let img = document.createElement('img');
  13. img.src = githubUser.avatar_url;
  14. img.className = "promise-avatar-example";
  15. document.body.append(img);
  16.  
  17. // 等待 3 秒
  18. await new Promise((resolve, reject) => setTimeout(resolve, ));
  19.  
  20. img.remove();
  21.  
  22. return githubUser;
  23. }
  24.  
  25. showAvatar();

  在类方法中的使用

  class Waiter{

    async wait(){

      retrun await Promise.resolve(1);

    }

  }

  new Waiter()

    .wait()

    .then(alert);//1

  

  

javaScript 基础知识汇总 (十四)的更多相关文章

  1. javaScript 基础知识汇总(四)

    1.对象 概念:对象可以通过花括号{...} 和其中包含一些可选的属性来创建. 属性时一个键值对,键是一个字符串,值可以是任何类型. 对象的创建 let user = new Object(); // ...

  2. JavaScript 基础知识汇总目录

    一.标签.代码结构.现代模式.变量.数据类型.类型转换 GO 二.运算符.值的比较.交互.条件运算符.逻辑运算符 GO 三.循环 while 和 for .switch语句.函数.函数表达式和箭头函数 ...

  3. javaScript 基础知识汇总 (十)

    1.New Function 语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) //无参数示例: let say ...

  4. javaScript 基础知识汇总 (十二)

    1.属性的标志和描述符 属性的标志 对象属性除value外还有三个特殊属性,即标志 writable ----如果为true,则可以修改,否则它只是只读的. enumerable ----如果为tru ...

  5. javaScript 基础知识汇总 (十五)

    1.模块简介 什么是模块: 模块就是一个文件,一个脚本,通过关键字export 和 import 交换模块之间的功能. export 关键字表示在当前模块之外可以访问的变量和功能. import 关键 ...

  6. JavaScript基础知识总结(四)

    JavaScript语法 八.函数 函数就是完成某个功能的一组语句,函数由关键字function + 函数名 + 加一组参数定义: 函数在定义后可以被重复调用,通常将常用的功能写成一个函数,利用函数可 ...

  7. JavaScript基础知识汇总

    1. 图片热区: <img src="logo.jpg" usemap="#logo"> <map id="logo" n ...

  8. javascript基础学习(十四)

    javascript之表单对象 学习要点: 表单对象 文本框 按钮 单选框和复选框 一.表单对象 在HTML文档中可能会出现多个表单,也就是说,一个HTML文档中可能出现多个<form>标 ...

  9. JavaScript基础笔记(十四)最佳实践

    最佳实践 一)松散耦合 1.解耦HTML/JavaScript: 1)避免html种使用js 2)避免js种创建html 2.解耦CSS/JS 操作类 3.解耦应用逻辑和事件处理 以下是要牢记的应用和 ...

随机推荐

  1. Node.js知识点详解(一)基础部分

    转自:http://segmentfault.com/a/1190000000728401 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的 ...

  2. python3的数据类型转换问题

    问题描述:在自我学习的过程中,写了个登陆,在input处,希望能够对数据类型进行判断,但是因为python3的输入的数据会被系统默认为字符串,也就是1,1.2,a.都会被系统默认为字符串,这个心塞啊, ...

  3. Selenium&Pytesseract模拟登录+验证码识别

    验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...

  4. spring-boot-学习笔记(三)-过滤器

      过滤器有两种配置方式,一种是通过注解来完成,一种是通过自定义配置类来设置 这里假设的场景是,定义一个过滤器,过滤所有请求,如果参数中没有username信息则重定向到login_page登录页面, ...

  5. 三星HTC价格跳水 安卓旗舰会否崩塌?

    安卓旗舰会否崩塌?" title="三星HTC价格跳水 安卓旗舰会否崩塌?"> 官方降价,对于国产手机来说似乎是家常便饭.小米.魅族等,总会时隔几个月就将自家旗舰机 ...

  6. LoraLU

    一.定义动画过程中形成的状态用transform transform 分为2D 和 3D,主要包含以下几种变换:旋转rotate.扭曲skew.缩放scale和移动 translate以及矩阵变形ma ...

  7. Android 粘合剂'Binder'

    背景知识 要详细掌握Android 的Binder通信机制需要先提前了解一些通信原理与Linux系统的基础知识. RPC RPC(Remote Procedure Call),即远程过程调用,也被称为 ...

  8. 利用Nginx或koa

    最近在做上传的图片的需求,思考上传之后的图片怎么访问的问题,因为后端是Node,一开始尝试写一个专门的接口通过传入图片的path来查找,试了一下感觉并不理想,因为要为每种类型的文件设置Content- ...

  9. 2019DDCTF部分Writeup

    -- re Windows Reverse1 通过DIE查壳发现存在upx,在linux上upx -d脱壳即可,拖入IDA,通过关键字符串找到关键函数: main函数中也没有什么,将输入的字符串带到s ...

  10. Geohash介绍

    Geohash介绍 Geohash是一种地址编码,能把二维的经纬度编码成字符串,某一区域范围内的经纬度是一致的,其中有编码长度控制区域的范围 精度参考 使用场景 实时LBS应用 LBS应用中,搜索某某 ...