一、异步编程背景
由于js的运行机制,JS引擎建立在单线程事件循环的概念上,js引擎同一时间只能执行一段代码,每当一段代码准备被执行,他就会被添加到作业队列。当JS引擎结束当前代码的执行后,事件循环就会执行队列的下一个作业。作业会从队列的第一个开始,一次运行到最后一个。
之前普遍使用的异步方式是回调模式。这种模式运作的很好,但是如果嵌套过多,就会让人觉得很麻烦。
methcod1(function(err,result){ if(err){ throw...
class MyPromise {constructor(executor) {this.state = pending; //初始状态为pendingthis.value = null;try {// class中默认是严格模式,这个executor是MyPromise中的函数,他的this指向的是window,class中默认严格模式, 所以调用this.resolve中的this指向undefined,这里手动绑定一下this,将this指向当前MyPromiseexecutor(this.resolve.bind(this),this.reject.bind(this));} catch(error) {this.reject(erro...
在根目录下创建env文件,创建index.js文件并配置多个开发环境 在index.js中配置
module.exports={//开发环境Dev:{"BaseUrl":"https://www.develep.com"},//测试环境Test:{"BaseUrl":"https://www.test.com"},//生产环境Prod:{"BaseUrl": "https://api.douban.com"}
}在根目录下创建http文件夹,在里面创建api.js文件和fetch.js文件还有http.js文件 在app.js中统一管理请求地址url:
module.exports={banner:"/home/multidata", //...
今天面试官问的我这个问题,说实话,我当时懵逼了。 我第一个想法竟然是:嘶~这问题挺简单的啊,不就是用 Date 对象判断是否大于某个时间差么?于是写出了下面这段代码:
let rest=function(){// 开始是放在外面的,但是面试官说要尽可能不单独暴露值,于是鬼迷心窍(紧张)杀都没想就直接扔进来了...let date=Date.now();return new Promise((resolve,reject)=>{let _date=Date.now();if(_date-date>2000){reject('请求超时');}re...
1、需求所在
最近在学node的时候,看到了回调地狱,以及使用promise解决这个问题的思路。首先呐,需求是这样的,使用node文件操作,分别读取a、b、c三个文件,但是必须在a文件加载完之后,再去加载b文件,b文件加载完之后再去加载c文件。 如果我们使用正常的方法的话,代码大概会是下面的样子:
var fs = require('fs');
fs.readFile('./data/a.txt', 'utf8', function(err, data) {if(err) {throw err} else {console.log(data);f...
1. 为什么要有promise···从代码上来说回避了回调嵌套的问题,其次promise可以保留异步请求的状态(即使得到结果不立刻执行回调,过一阵再执行仍然是可以的。)···从思想上来说,我们设计一连串事件abc的思路是,先做a,a行的话做b,a不行做f。b行的话做c,b不行那也做f。最后c行就成功了,c不行还是做f。原始的回调函数写出来是这样的思路:a行的话做b,b行的话做c,c行的话成功,c不行做f,b不行做f,a不行做f。那么Promise显然更...
构造一个 Promise,最基本的用法如下:
var promise = new Promise(function(resolve, reject) {if (...) { // succeedresolve(result);} else { // failsreject(Error(errMessage));}});
Promise 实例拥有 then 方法(具有 then 方法的对象,通常被称为thenable)。它的使用方法如下:
promise.then(onFulfilled, onRejected)接收两个函数作为参数,一个在 fulfilled 的时候被调用,一个在rejected的时候被调用,接收参数就是 ...
异同: 1、promise解决的是串行的嵌套异步问题。 2、yield把Generator Function切割为有多个出口的Generation。 3、Promise是社区的研发产物,yield是ECMA-262从别处参数而来的类协程实现(就是ruanyf里面说的半协程)。 4、yield可以做到非串行,而Promise很难,Promise兼容性强,yield是未来。 5、generator的本质不是用来解决异步的。Promise: 特点: 1. 原本嵌套式的callback模型变成“看上去线性”的模型,以此提供代...
1、为什么需要异步?JS是单线程语言
JS和DOM渲染共同使用一个线程,因为JS可以修改DOM结构,如果不是同线程,那DOM渲染会混乱~(不知道听谁的,或者顺序不对)
JS执行过程中,DOM渲染必须停止;反之亦然然而,很多场景下,如果一直等待会浪费资源,用户体验也很不好
所以--------需要异步异步的使用场景
网络请求:如,Ajax图片加载
定时任务:如,setTimeout 等等一般用回调函数的形式实现异步!
2、promise的出现
回调地狱...
异步管理一直是前端开发的一个重点。
就多个promise的顺序执行,总结了下面几种方案。
使用回调的方案,也是最传统的方案const f1 = ()=>new Promise((resolve, reject)=>{setTimeout(()=>{console.log(p1 runing)resolve(1)}, 1000)})const f2 = ()=>new Promise((resolve, reject)=>{setTimeout(()=>{console.log(p2 runing)resolve(2)}, 1000)})// 使用回调形式f1().then(()=>{f2()})使用async、await的方案。 const f1 = ()=>n...
// 打包压缩config.plugin('CompressionPlugin').use(new CompressionPlugin({filename: '[path].gz[query]', // 压缩后的文件名(保持原文件名,后缀加.gz)algorithm: 'gzip', // 使用gzip压缩test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'), // 匹配文件名threshold: 10240, // 对超过10k的数据压缩minRatio: 0.8 // 压缩率小于0.8才会压缩}))
使用vue cli 4 webpack进行打包时出现了 ERROR TypeError:Cannot...