美文网首页
ES6 -异步编程

ES6 -异步编程

作者: 小二儿上酒 | 来源:发表于2019-01-08 11:13 被阅读6次

javascript 是基于单线程的,如果想实现多个任务,需要任务队列来实现。

事件模型:点击按钮触发事件队列,异步代码会在未来的某个时间点执行

回调模式:被调用的函数是作为参数传入的。弊端:嵌套回调

promise: 相当于异步操作结果的占位符,不会触发一个事件,也不会传入回调函数给目标函数,而是返回一个Promise。

回调函数

事件处理 callback ,回调函数作为参数传递。

Promise

promise 是 用来解决异步回调嵌套地狱问题。

promise 三种状态 先是处于进行中pending状态,此时操作尚未完成,所以它是为处理的;一旦异步操作执行结束,它变成已处理settled状态。

3种状态 pending fulfilled(异步操作成功完成) rejected(出现错误未能成功完成)

所有的promise 都有 then(fulfilled,rejected) 方法,fulfilled 函数 成功都执行它,rejected 函数 失败都执行它。

如果实现了then() 方法的对象,这个对象可以称为thenable对象。所有的promise都是thenable对象,但是并非所有thenable对象都是promise.

setTimeout 模拟调试

// promise解决了异步回调嵌套的问题.异步不仅是ajax
// 执行一个异步操作,正在执行,成功,失败.
// 回调中有两个参数,第一个表示成功,第二个表示失败
let promise = new Promise(function(resolve,reject){
    setTimeout(function(){
        // 执行了一些异步操作
        // if()
        console.log('我是在进行一些异步操作');
        if(false){
            resolve(); //执行成功的话就调用该方法;
        }else{
            reject();  // 执行的异步代码失败后执行;
        }
    },2000);
});

// 这个then方法里的参数是异步结果出来后的回调。
promise.then(function(){
    console.log('我知道了,你执行成功了!!!');
},function(){
    console.error('我知道你代码执行失败了!');
});
console.log(promise);

js脚本文件

function loadScript(url){
    return new Promise(function(resolve,reject){
        var ele = document.createElement('script');
        // 加载成功
        ele.onload = function(){
            resolve('成功请求数据');//成功则调用该方法
        };
        ele.onerror = function(){
            reject('请求数据错误');//失败则调用该方法
        };
        ele.src = url;
        document.body.appendChild(ele);
    });
}

var promise = loadScript('../js/common.js');

promise.then(function(data){
    console.log('好开心,加载成功了呢!');
    console.log(data);
},function(data){
    console.error('呜呜~~~,失败了好伤心。。。。');
    console.log(data);
});

promise.then(function(data){
    console.log('/////////');
    console.log(data);
    console.log('//////////');
})

读取文件

let fs = require("fs");
function readFile(filename) {
  return new Promise(function(resolve,reject){
     fs.readFile(filename,function(err,data){
       if(err){
         reject(err); // 失败
         return;
       }
       
       resolve(data); // 成功
     });
  });
}
let promise = readFile(".txt");
promise.then(function(contents){
  // 完成
  console.log(contents);
},function(err){
  // 拒绝
  console.error(err.message);
});

// 异常处理
promise.catch(function(err){
  console.log(err.message);
});

Fetch

Fetch API 已被 Firefox 39(Nightly)以及 Chrome 42(dev)已经内置支持。垫片技术 polyfill

Fetch API 中最常用的是 fetch() 方法,该方法最简单的形式是,接受一个 URL 参数并返回以一个 promise 对象:

fetch('data.json').then(function(res){
    console.log(res); //Response
    if(res.ok){
        //console.log(res.json()); //Promise
        return res.json();
    }else{
        console.log("貌似反应是不完美的,status:", res.status);
    }
},function(error){
    console.log("Fetch failed!", error);
}).then(function(json){
    console.log(json);  //JSON对象
});

相关文章

  • ES6文章合集

    一、深入理解ES6异步编程 JavaScript 的单线程,如果没有异步编程的话将会苦不堪言。ES6 之前,异步编...

  • 【ECMAScript6】 Promise

    Promise 是什么 Promise 是 ES6 为 JavaScript 异步编程定义的全新 api 。为异步...

  • 重读 ES6 - async+await 同步/异步方案

    异步编程一直是JavaScript 编程的重大事项。关于异步方案, ES6 先是出现了 基于状态管理的 Promi...

  • ES6 Promise 异步编程方案

    为什么使用 Promise ? Promise 是 ES6 提出的异步编程方案 ! ES6 之前,如果我们都是通过...

  • Promise 就是这么简单

    Promise 是干嘛的? Promise是ES6针对js异步编程一种解决方案,也解决了ES5之前异步编程大量回调...

  • ES6异步函数sync

    es6新增的sync是用来解决异步编程的函数,最常见的异步编程就ajax请求,一般开发中都会遇到一个场景,就是封装...

  • 浅谈promise的用法

    promise 是es6中新增的一个对象 是异步编程的解决方案,主要解决异步编程中多个回调函数的使用问题 在实际...

  • [ES6] Promise

    Promise Promise是ES6提出解决异步编程的方案,相比于传统的回调函数,Promise更符合人们的编程...

  • 哈罗出行面试

    1. es6中generator generator是es6的异步编程解决方案简单应用如下: 用处用一下几点: 异...

  • 12、【ES6】Promise

    Promise 是 ES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数,用来封装异步操作并...

网友评论

      本文标题:ES6 -异步编程

      本文链接:https://www.haomeiwen.com/subject/smdvrqtx.html