我知道的JS-异步


异步

Promise

Promise 是 Es6 新增的语法,为了解决回调地狱的问题
Promise 有三种状态,pending(初始状态),可以通过函数 resolve 和 reject 把状态变为 resolved 或者 rejected,状态只能改变一次

function xxx(){
    return new Promise(function(resolve,reject){
        setTimeout(()=>{
            resolve()
            //或者
            //reject()
        },1000)
    })
}
xxx().then(......)

async/await

ES8 引入的 async 函数,可以更加方便的处理异步

一个函数如果加上 async ,那么该函数就会返回一个 Promise

function returnPromise() {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      console.log("finish");
      resolve("muxue");
    }, 3000);
  });
}

//之前我们可以这样写
// returnPromise().then(result => {
//     console.log(result)
// });

async function test() {
  let result = await returnPromise(); // 注意只有控制台支持顶级作用域的 await,JS 文件里的 await 只能写在 async 函数里
  console.log(result);
}
test();

generator

function fn(a, b) {
  return a + b;
}
function* gen(x) {
  console.log(x);
  let y = yield fn(x, 100) + 3;
  console.log(y);
  return 200;
}
let g = gen(1);
console.log(g.next().value);
// 1  104
console.log(g.next().value);
//undefined 200

当调用 g.next()时,gen 函数开始执行,执行到第一个 yield 为止,并把 yield 表达式的值作为状态对象的值。更具体一点,上例先输出 x 也就是 1,然后执行 fn(x, 100) 输出 fn..并返回 101, 然后加 3。这时候停止执行,把结果 104 赋值给状态对象 g,g 的结果变 {value: 104, done: false}。需要注意,yied 表达式的优先级极其低,yield fn(x,100) + 3 相当于 yield (fn(x,100) + 3)
第二次执行 g.next()的时候,代码由上次暂停处开始执行,但此时 yield 表达式的值并不是使用刚刚计算的结果,而是使用 g.next 的参数 undefined, 所以 y 的值变为 undefined,输出 undeined。执行到 return 200 时,状态对象知道执行结束了,会把 return 的 200 赋值到状态对象,结果为 { value: 200, done: true }
如何把刚刚计算的中间值 103 给下个 yield 来用呢?好问题,我们可以这样

g.next(g.next().value);

文章作者: 沐雪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沐雪 !
评论
 上一篇
我知道的JS-继承 我知道的JS-继承
继承继承可以使得子类具有父类的各种属性和方法在高程中介绍了好多种,但是完美的就这一种,所以,就理解好这一种就可以了 ES5 中的继承function Human(name) { this.name = name; } Human.pro
2018-04-10
下一篇 
我知道的JS-防抖和节流 我知道的JS-防抖和节流
防抖和节流之前一直不明白或者弄混两者,也是因为没有遇到这种需求作用:都是防止函数多次调用区别:防抖动是将多次执行变为最后一次执行(将多个信号合并为一个信号),节流是将多次执行变成每隔一段时间执行。 防抖(debounce)使用场景inp
2018-04-05
  目录