Promise 的then 与 async await 写法相互转化

本来一直是用then来对promise进行处理的 , 今天在用react-native-stroge的时候发现作者很推崇async await的写法
于是研究了一下,把自己的代码替换了.
下面进入正题

在使用的时候,我存值时是这么写的:

    // 存值
    createData(title, successBack, errorBack) {
        // 使用key保存数据
        storage.save({
            key: title,   
            data: 'true',
        }).then(successBack(), errorBack());
    }

然后我用async + await来写 :

    //存值
    async createData1(title, successBack, errorBack) {
        try {
            // 使用key保存数据
            await storage.save({
                key: title,  
                data: 'true',
            });
            successBack()
        } catch (e) {
            errorBack()
        }
    }

其实后者的写法,看上去更容易理解, async代表异步操作 , 说明这个方法是异步的, await为等待,
代码块可接理解为 等这个执行完成,就执行下面的successBack()方法 , 出错就执行errorBack()
try catch不能忘!

当然这种写法是,等待的东西没用返回结果, 那么有返回结果的该怎么把值传递出去呢?
于是我把取值的方法重写了:

先看一下文档的写法:

// 查询
    inquireData() {
        storage.load({
            key:'storageTest',
            autoSync: true,
            syncInBackground: true,
            syncParams: {
                extraFetchOptions: {
                    // 各种参数
                },
                someFlag: true,
            },
        }).then(ret => {

            this.setState({
                data: ret.name
            });

        }).catch(err => {

            console.warn(err.message);
            switch (err.name) {
                case 'NotFoundError':
                    // 更新
                    this.setState({
                        data:'数据为空'
                    });

                    break;
                case 'ExpiredError':
                    // TODO
                    break;
            }
        })
    }

然后是我改之后的:

async select(title, successBack, errorBack) {
        // 读取
        try {
            const l = await storage.load({
                key: title,
                autoSync: true,
                syncInBackground: true,
                syncParams: {
                    extraFetchOptions: {
                        // 各种参数
                    },
                    someFlag: true,
                },
            })
            successBack(l)
        } catch (e) {
            errorBack(e);
        }
    }

可能是错觉,但总觉得变好看了一些.
上完整的:

/**
 * Created by 卓原 on 2018/3/20.
 * zhuoyuan93@gmail.com
 */
import React from 'react';
import {
    View,
    StyleSheet,
} from 'react-native';
import {Checkbox} from 'teaset';
import * as ScreenUtil from "../util/ScreenUtil";

export default class CheckBox extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            checked: false,
        }
    }

    componentDidMount() {
        let {title} = this.props.item;
        this.select(title, (result) => {
                console.log(title + ':' + result)
                if (result) {
                    this.setState({
                        checked: true
                    })
                }
            },
            (err) => console.warn(err.message))


    }

    render() {
        let {title} = this.props.item;
        return (
            <View style={styles.checkView}>
                <Checkbox
                    title={title}
                    checked={this.state.checked}
                    onChange={checked => this._changeChecked(checked)}
                    size={'lg'}
                />
            </View>
        )

    }


    _changeChecked(checked) {

        let {title} = this.props.item;
        if (checked) {
            //存储
            this.createData(title, () => console.log('存储成功'),
                error => console.log(error),);

        } else {
            this.delete(title, () => console.log('删成功'));
        }
    }

    // 增加
    async createData(title, successBack, errorBack) {
        try {
            // 使用key保存数据
            await storage.save({
                key: title,    // 注意:请不要在key中使用_下划线符号!
                data: 'true',

                // 设为null,则不过期,这里会覆盖初始化的时效
                // expires: 1000 * 60
            });
            successBack()
        } catch (e) {
            errorBack()
        }
        //.then(() => alert('成功'), () => alert('失败'));
    }

    async select(title, successBack, errorBack) {
        // 读取
        try {
            const l = await storage.load({
                key: title,
                // autoSync(默认为true)意味着在没有找到数据或数据过期时自动调用相应的sync方法
                autoSync: true,

                // syncInBackground(默认为true)意味着如果数据过期,
                // 在调用sync方法的同时先返回已经过期的数据。
                // 设置为false的话,则等待sync方法提供的最新数据(当然会需要更多时间)。
                syncInBackground: true,

                // 你还可以给sync方法传递额外的参数
                syncParams: {
                    extraFetchOptions: {
                        // 各种参数
                    },
                    someFlag: true,
                },
            })
            successBack(l)
        } catch (e) {
            errorBack(e);
        }
    }

    async delete(title, successBack) {
        try {
            await storage.remove({
                key: title
            });
            successBack()
        } catch (e) {
            console.error(e.message)
        }

    }


}

const styles = StyleSheet.create({
    checkView: {
        width: ScreenUtil.screenW / 2,
        padding: ScreenUtil.scaleSize(10)
    }
});

完整项目在:GitHub

promiseasync/await都是用于处理异步操作的方式,但它们在语法和使用上有一些区别。 1. PromisePromise是ES6引入的一种处理异步操作的方式。它是一个对象,表示一个异步操作的最终完成(或失败)及其结果的值。Promise提供了一个链式的调用方式,可以通过then()方法来处理异步操作的结果,也可以通过catch()方法来处理异常情况。 2. async/awaitasync/await是ES8引入的一种处理异步操作的方式。它是基于Promise的语法糖,使得异步代码看起来更像同步代码。使用async关键字声明一个函数为异步函数,然后在需要等待异步操作结果的地方使用await关键字来等待Promise对象的完成。 区别: - 语法简洁性:async/await相对于Promise更加简洁,更接近于同步代码的写法,使得代码更易读、易理解。 - 错误处理:使用Promise时需要通过catch()方法来捕获异常,而async/await可以使用try/catch语句来处理异常,使得错误处理更加直观。 - 链式调用:Promise通过链式调用的方式来处理多个异步操作,而async/await可以使用同步的方式编写多个异步操作,使得逻辑更加清晰。 - 可读性:async/await相对于Promise更加易于理解和阅读,特别是对于有较多异步操作的代码块。 需要注意的是,async/await是基于Promise的,实际上async函数会返回一个Promise对象。在使用async/await时,可以将任何返回Promise对象的异步操作转化为同步的写法,但在某些情况下可能会导致阻塞。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值