有关then的“链式调用”

 

let str1 = 'str1 ';


const func1=(str1)=>new Promise((resolve,reject)=>{
    resolve(str1 + 'str2 ');
})
const func2=(str2)=>new Promise((resolve,reject)=>{
    resolve(str2 + 'str3 ');
})
const func3=(str3)=>new Promise((resolve,reject)=>{
    resolve(str3 + 'str4 ');
})

可能不怎么有价值的一篇。

因为我不求甚解,之前的代码经常在使用Promise的前提,创造了新式的“回调地狱”(函数作为参数层层嵌套)

错误示例如下(其实并不算错,只是把洗衣机用作了洗衣盆):

func1(str1)
.then(res=>{

    func2(res)
    .then(res=>{

        func3(res)
        .then(res=>{

            console.log(res);
            console.log("==================");
        })
    })
})

结果是正确结果,但,这就还是回调地狱,只不过披上了一层Promise的皮。

下面是正确的链式调用:


func1(str1)
.then(res=>func2(res))
.then(res=>func3(res))
.then(res=>{
     console.log(res);
     console.log("==================");
})

MDN关于“链式调用”的讲解如下:

"then 方法返回一个 Promise 对象,其允许方法链。

你可以传递一个匿名函数给 then,并且,如果它返回一个 Promise,一个等价的 Promise 将暴露给后续的方法链。"

代码讲解:

func1方法接收str1返回一个Promise对象,.then的第一个参数进入resolve分支,将第一个res传递给func2。

而func2也返回了一个Promise对象,故第一处then写成then(res=>func2(res)),通过箭头函数返回方法调用来直接返回【func2(res)所返回的Promise对象】,因此满足了条件——传给then的一个匿名函数,且这个匿名函数返回一个Promise

那么,便可以直接在.then(res=>func2(res))的后面继续写上.then(res=>func3(res)),这里的第二个.then所捕获到的Promise对象,正是func2(res)所返回的。

 

完整的demo代码

let str1 = 'str1 ';


const func1=(str1)=>new Promise((resolve,reject)=>{
    resolve(str1 + 'str2 ');
})
const func2=(str2)=>new Promise((resolve,reject)=>{
    resolve(str2 + 'str3 ');
})
const func3=(str3)=>new Promise((resolve,reject)=>{
    resolve(str3 + 'str4 ');
})


func1(str1)
.then(res=>{

    func2(res)
    .then(res=>{

        func3(res)
        .then(res=>{

            console.log(res);
            console.log("==================");
        })
    })
})

func1(str1)
.then(res=>func2(res))
.then(res=>func3(res))
.then(res=>{
     console.log(res);
     console.log("==================");
})

在线demo地址:https://jsrun.net/Z26Kp/edit

在线demo截图

========================================

2020-12-03补充,在axios里,可以这样链式调用

function test(){
	axios.post(GLOBAL_URL.addTag, { 参数 })
                .then(res => {
                    res = res.data;
                    if (res.code === "200") {
                        //注意下面的这句return
                        return axios.post(GLOBAL_URL.updateTarcileMidTag, { 参数})
                    } else {

                    }
                })
                .then(res => {
                    if (res) {//这里要加个if(res)
                        res = res.data;
                        if (res.code === "200") {

                        } else {
                            
                        }
                    }


                })
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ES6(ECMAScript 2015)引入了Promise对象,它是一种异步编程的解决方案。当一个异步操作完成后,Promise对象会返回一个代表操作结果的值,而不是像传统方式那样使用回调函数。 Promise对象的then方法用于指定操作成功和失败时的回调函数。而且可以将then方法连续使用,形成链式调用。当一个Promise对象的then方法返回另一个Promise对象时,后续的then方法都会等待该Promise对象的状态改变。 链式调用的好处在于减少了回调函数嵌套的层数,提高了代码的可读性和可维护性。通过then方法的链式调用,可以构建一串异步操作,使得代码逻辑更加清晰。 例如: ``` function getJSON(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(xhr.responseText)); } else { reject(new Error('Unable to fetch data')); } } }; xhr.send(); }); } getJSON('/data/user.json') .then(user => { return getJSON(`/data/profile/${user.id}.json`); }) .then(profile => { console.log(profile); }) .catch(error => { console.error(error); }); ``` 上述代码展示了一个获取用户信息和个人资料的异步操作,其中getJSON函数返回一个Promise对象。通过then方法的链式调用,可以先获取用户信息,然后再获取个人资料。如果有任何一个异步操作失败,则会进入catch回调函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

devwolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值