美文网首页
Promise 规范

Promise 规范

作者: monkeyfly36 | 来源:发表于2020-05-27 15:59 被阅读0次

ES6中采用了 Promise/A+ 规范
https://www.imooc.com/learn/949

Promise标准解读,记住两点:
1.一个promise的当前状态只能是pending、fulfilled和rejected三种之一。状态改变只能是pending到fulfilled或者pending到rejected。状态改变不可逆。
(2) promise的then方法接收两个可选参数,表示该promise状态改变时的回调(promise.then(onFulfilled, onRejected))。then方法返回一个promise,then方法可以被同一个 promise 调用多次。
注:Promise/A+并未规范race、all、catch方法,这些是ES6自己规范的。

Promise原理:采用了观察者模式

function Promise(fn) {
    var value = null
    var callbacks = []  //callbacks为数组,因为可能同时有很多个回调

    this.then = function (onFulfilled) {
        callbacks.push(onFulfilled)
    }

    function resolve(value) {
        callbacks.forEach(function (callback) {
            callback(value)
        })
    }

    fn(resolve)
}

题:
1.红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promise实现)三个亮灯函数已经存在。

function red() {
  console.log('red')
}
function green() {
  console.log('green')
}
function yellow() {
  console.log('yellow')
}

var light = function (timmer, func) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      func()
      resolve()
    }, timmer)
  })
}

var step = function () {
  Promise.resolve().then(function () {
    return light(3000, red)
  }).then(function () {
    return light(1000, green)
  }).then(function () {
    return light(2000, yellow)
  }).then(function () {
    step()
  })
}

2.实现 mergePromise 函数,把传进去的数组按顺序先后执行,并且把返回的数据先后放到数组 data 中。

const timeout = ms => new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve()
    }, ms)
})

const ajax1 = () => timeout(2000).then(() => {
    console.log('1')
    return 1
})

const ajax2 = () => timeout(1000).then(() => {
    console.log('2')
    return 2
})

const ajax3 = () => timeout(2000).then(() => {
    console.log('3')
    return 3
})

const mergePromise = ajaxArray => {
    // 在这里实现你的代码

}

mergePromise([ajax1, ajax2, ajax3]).then(data => {
    console.log('done')
    console.log(data) // data 为 [1, 2, 3]
})

3.打印顺序

const first = () => (new Promise((resolve, reject) => {
    console.log(3)
    let p = new Promise((resolve, reject) => {
        console.log(7)
        setTimeout(() => {
            console.log(5)
            resolve(6)
        }, 0)
        resolve(1)
    })
    resolve(2)
    p.then((arg) => {
        console.log(arg);
    })

}))

first().then((arg) => {
    console.log(arg)
})
console.log(4)
// 3,7,4,1,2,5

注:常见异步方法:
1.回调函数
2.事件监听
3.发布/订阅
4.Promise对象

相关文章

  • Promise原理及实现

    Promise标准 Promise 规范有很多,如Promise/A,Promise/B,Promise/D 以及...

  • Promise实现

    实现Promise根据Promise规范规范很短,所以每句都很重要 Promise特点 状态改变后不可再改变(状态...

  • Promise

    CommonJs的Promise规范有许多种,我们一般讨论的是Promise/A+规范,它定义了Promise的基...

  • lesson 1 promise规范学习笔记 -- 2021-0

    课程标题 路白-Promis规范 课程目标 了解promise a+规范 根据promise a+规范手写出自己的...

  • 35_谈谈你对promise的用法和理解

    一、初识Promise 1、什么是promise? Promise可能大家都不陌生,因为Promise规范已经出来...

  • Promise

    Promise迷你书 Promise在规范上规定 Promise只能使用异步调用方式 。 Promise.reso...

  • Promise

    什么是Promise Promise解决了什么问题 Promise/A+规范 Promise的原理(如何实现链式调...

  • 实现 Promise/A+ 规范 & ES6 Promise方法

    实现 Promise/A+ 规范 检测通过 实现 ES6 Promise 方法

  • 26:promise+Generator+Async 的使用

    Promise 解决的问题:回调地狱 Promise 规范: promise 有三种状态,等待(pending)、...

  • Promise实现

    实现的Promise,符合Promise/A+规范。 promise题目 async题目 再来一个 参考 segm...

网友评论

      本文标题:Promise 规范

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