promise和链式调用

Posted 赵不悔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了promise和链式调用相关的知识,希望对你有一定的参考价值。

什么是链式调用

当年我真的不理解什么是链式调用,甚至我不知道什么是调用
后来接触了jQuery才知道原来这个就是链式
仿佛是当年老鹰抓小鸡,用手抓住上一个人

$("*").css({ background :"#000" }).width("100px").height("100px")

使用了class

class 将你输入的名称放入在盒子里的this.name

class Person {
    constructor(txt) {
        this.name = txt;
    }
    xx() {
        console.log(this.name + \'英俊\');
        return this;
    }
    oo() {
        console.log(this.name + \'潇洒\');
        return this;
    }
}
new Person("我").xx().oo()

Promise简单实用

首先为什么要解决异步请求。因为某一个事件非常重要!必须按顺序123加载才可以。
但是第二步的异步请求太慢,而第三步已经加载完毕。所以第二步提示undefined。
为了解决这个问题。出现了Promise简单实用

function a(){ return "我" }
function b(){ 
 return new Promise((res, rej)=>{
     setTimeout(()=>{
         res("爱")
     }, 3000)
 })
}
function c(){ return "倪" }

async function run(){  
console.log(a())
console.log(await b())
console.log(c())
}
run()

JS小demo
首先定制随机数,然后使用 new Promise回调函数,有两个形参!一个成功一个失败
valve 信息/值
reason 理由
function num(min, max){
    return Math.ceil(  Math.random() * (max-min)  ) + min
}


var p = new Promise((res, rej)=>{
    let a = num(1, 100)
    if(a <=30 )
    {
        console.log(a)
        res()
    }
    else{
        console.log(a)
        rej()
    }
})

p.then((val)=>{
    console.log("中奖"+val)
}, (reason)=>{
    console.log("失败"+reason)
})

Node小Demo
引入fs,然后在promise当中回调函数成功与失败
fs获取文件,回调两个!必须先 失败 后 成功
const fs = require("fs")

var p = new Promise((res, rej)=>{
    
    fs.readFile("./src/info.txt", (err, succ)=>{
        
        if(err) rej(err)
        res(succ)
    })
    
})


p.then(val=>{
   console.log( val.toString())
}, err=>{
    console.log(err)
})
  • 基础上进行封装
function Paths(path)
{
   return new Promise((res, rej)=>{
       require("fs").readFile(path, (err, data)=>{
           if(err) throw rej(err)
           res(data)
       })
   })
}

Paths("./src/info.txt").then((val)=>{
    console.log( val.toString() )
},(reason)=>{
    console.log(reason)
})
  • 运用node来帮助prpmise减少步骤
  • 但是切记是const fs = xxx,而不是const fs require("fs")
const fs = require("fs")
const util =  require("util")

let a = util.promisify( fs.readFile )

a("./src/info.txt").then(val=>{
    console.log( val.toString() )
})

ajax小demo
我使用的是axios
<ul>
    <li v-for="(item, key) in list" :key="key">
        {{item.id}} {{item.title}}
    </li>
</ul>
<button @click="ck">测试</button>

<script>
    import axios from "axios"
    export default{
        data(){
            return{  list:[]  }
        },
        methods:{
            ck() {
                var api = "http://jsonplaceholder.typicode.com/posts"
                var p = new Promise((res, rej)=>{
                    axios.get(api).then((succ)=>{
                        res(succ)
                    }).catch((err)=>{
                        rej(err)
                    })   
                })
                
                p.then((val)=>{
                    this.list = val.data
                },(reason)=>{
                    console.log(reason)
                })
            }
        }
    }
</script>

Promise多次回调

其实就是怕你这次list调用了一次,我还想调用别的

var a = new Promise((res, req)=>{
    res("OK")
})

a.then((val)=>{
  alert(val)  
}).then((val)=>{
    console.log(val)
})

async

简单理解这个东西,其实他就是一个能把函数变成 promise的神器
编完之后反出来一个函数名加一个then就能显示你要的东西

可以放三样东西,一个成功两个失败
第一个就是非promise
第二个就是promise成功与否看见你给我什么了
第三个直接认输!上来就报错,懒得return

async  function xx(){
   return "成功率"

   return new Promise((res,rej)=>{
       rej("失败了!曹尼玛")
   })

   throw "失败了"
}


var a = xx()

console.log(a) //用来查看promise的信息的

a.then((val)=>{
    console.log(val)
},(err)=>{
    console.log(err)
})

await

上一节课说道async这个东西把所有转换成promise返给你
而这个await是你这个加载东西是否能拿到,拿到了就返给你。你再换成promise

async function xx() {
    var a = new Promise((res, rej) => {
        res("nb")
    })

    var b = new Promise((res, rej) => {
        rej("err")
    })

    var c = await 250

    var t1 =  await a//此时返回来的是 最终结果 一个值
    var t2 =  await b//会报错,想看结果
        try{
            var t2 =  await b
        }
        catch(err)
        {
            console.log(err)
        }
    var t3 = c//他就是纯数字反数字
}

console.log(xx())

双剑合并

这个就是传统的回调地狱,读取完还要接着上一个屁股后

var fs = require("fs")
fs.readFile("./src/a.txt", (err, data1)=>{
    if(err) throw err
    fs.readFile("./src/b.txt", (err, data2)=>{
        if(err) throw err
        fs.readFile("./src/c.txt", (err, data3)=>{
            if(err) throw err
            console.log(data1 + data2 + data3)
        })
    })
})

有了它,可以快读的解决!

var fs = require("fs")
var util = require("util")
var sb = util.promisify(fs.readFile)

async function xx()
{
    var a1 = await sb("./src/a.txt")
    var a2 = await sb("./src/b.txt")
    var a3 = await sb("./src/c.txt")
    console.log(a1+a2+a3)
}
xx()

或者

a.addEventListener("click", async function(){
    let b = await xxxxx
    console.log(b)
})

总结

他的异步请求其实只有这几件事
a1拿到数据返回,async反出来给xx()
如果错误那就返回错的原因

async function xx()
{
    var a1 = await sb("./src/a.txt")
    var a2 = await sb("./src/b.txt")
    var a3 = await sb("./src/c.txt")
    console.log(a1+a2+a3)
}
xx()

以上是关于promise和链式调用的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 promise:promise的三种状态与链式调用

链式调用就是promise的优点吗?

如何中断Promise的链式调用?

Promise的链式调用三种写法,Promise.all与式调用

ES6 Promise对象then方法链式调用

jQuery的链式调用原理,Promise的链式调用,this的问题