await is a reserved word,yield is a reserved word报错解决

await is a reserved word报错

  该报错提示,await 是保留字 ,一开始由于使用的框架是 react ,某个接口需要在 state 更新后,再进行调用,情况类似如下代码(为了演示故意写成如下情况)。

import { Restful } from './Restful'
...

/**
 * @private
 * @method 查询使用接口数据
 * @param {object} data
 * @returns undefined
 * @author
 */
onDataChange = (data) => {
   this.setState({
        data
    }, () => {  // 该方法需要先把数据更新到state中,然后再从state中获取数据进行查询
        let dataID = null;
        //查询接口数据
        let queryData = {
            method: 'POST',
            url: '/restful/query/data',
            data: {
                code: this.state.data.code,
                data: this.state.data.param
            }
        };
        Restful.fetch(queryData).then((response) => {  //先查询这个接口,获取ID
            if (response.data.code === 0) {
                dataID = response.data.dataID;
            }
        });

        //使用接口数据
        let useData = {
            method: 'POST',
            url: '/restful/use/data',
            data: {
                id: dataID
            }
        };
        Restful.fetch(useData).then((response) => {   //用上面查询到的ID,再调用这个接口
            if (response.data.code === 0) {
                ...
            }
        });
    });
}

  上面的 restful 是封装的 axios 接口,类似下方代码。

export default class Restful {
    /**
     * 外部调用发送请求
     * @param {object} fetchObj 请求时传入参数
     */
    static fetch(fetchObj) {
        return new Promise(function (resolve, reject) {
            axios({
                ...fetchObj,
                timeout: 30000,
                headers: {
                    Authorization: window['token'],
                    'Content-Type': 'application/json'
                }
            }).then(function (response) {
                resolve(response);
            }).catch(function (response) {
                reject(response);
            });
        });
    }
}

  上面方法中,我想先执行 queryData ,查询到 id 后,在拿着 id 去调用下一个接口,一开始直接在最外层的方法上增加了 async 如下所示。

onDataChange = (data) => {
    async function changeData(data) {    
        this.setState({
            data
        }, () => {    // ** 此处是需要修改的点
            let dataID = null;
            //查询接口数据
            let queryData = {
                ...
                }
            };
            await Restful.fetch(queryData).then((response) => {  //这里直接报错await is a reserved word
                if (response.data.code === 0) {
                    dataID = response.data.dataID;
                }
            });

            //使用接口数据
            let useData = {
                ...
            };
            await Restful.fetch(useData).then((response) => {
                if (response.data.code === 0) {
                    ...
                }
            });
        });
    }
    changeData(data);
}

  上面代码运行直接报错 await is a reserved word 原因在上面 ** 符号处,原因是 await 只能在 async 函数 中使用(这句话很重要)。

  上面存在函数嵌套,虽然外层函数设置成了 async 函数 但是其内部存在一个回调函数,严格意义上来说,这个回调函数,不属于 async function changeData 的内部,所以该回调函数没有设置成 async,那么其内部的 await就不会生效,而是当做变量去处理,同时这个又是关键字,才报出来那个错。

  修改方法很简单,把外面的那个 async 放到回调函数前面就可以了,效果如下

onDataChange = (data) => {
                       // 原来在这里的 async 删掉
    this.setState({
        data
    }, async function() {    // 把这个回调函数设置成 async函数
        let dataID = null;
        //查询接口数据
        let queryData = {
           ...
        };
        await restful.fetch(queryData).then((response) => {
            if (response.data.code === 0) {
                dataID = response.data.dataID;
            }
        });

        //使用接口数据
        let useData = {
           ...
        };
        await restful.fetch(useData).then((response) => {
            if (response.data.code === 0) {
                ...
            }
        });
    });
}

  需要注意的是,如果 async 函数 内部没有 await 那么它和普通函数一样。

举一反三

  上面代码中,我故意加入了 restful 封装接口的使用,是应为它也符合回调函数设置成 async 的情况。举个例子,我想先查询第一个接口,然后第二个,然后第三个。

async function query() {    // 如果 async 写在这里,await那里还是会报错
    Restful.fetch(first).then((response) => {

        await Restful.fetch(second).then((response) => {
        
        });

        await Restful.fetch(third).then((response) => {
            
        });
    })
}

正确写法

Restful.fetch(first).then(async function(response) {  //写在这里才可以正常运行

     await Restful.fetch(second).then((response) => {
     
     });

     await Restful.fetch(third).then((response) => {
         
     });
 })

yield is a reserved word报错

  yield is a reserved word 报错原因和上面 await 一样,yield 必须写在 generator 函数 内部,回调函数不属于某个函数,而是属于在满足某些条件后,执行的函数。写法如下

Restful.fetch(first).then((response) => {

     Restful.fetch(second).then((response) => {
     	let useData = generator();  //在第二个异步调用中使用 generator 函数
     	useData.next();
     	useData.next();
     });
     fucntion* generator() {   //把第三个要执行的异步设置成 generator 函数
		yield Restful.fetch(third).then((response) => {
         
     	});
	 }
})

  个人感觉,generator 函数 的作用在于,可以手动的操作函数运行,让谁执行,让谁停止,变成了完全可控状态,不过相比于async 使用起来还是相对麻烦一点。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误消息指的是在 JavaScript 代码中使用了 "await",但当前环境不支持 async/await 语法。请确保代码运行在一个支持 async/await 的 JavaScript 环境中,比如使用 Babel 转译代码或者在服务器端运行代码。 ### 回答2: "unexpected reserved word 'await'"是一个JavaScript语法错误,意思是在代码中出现了意外的保留字'await'。这个错误通常是因为在不支持异步函数的环境下使用了'await'关键字。 在JavaScript中,'await'关键字通常用于异步函数中,用于暂停当前函数的执行,等待一个Promise对象的解决(resolve)。这个关键字必须在async函数中使用,以便正确处理异步操作。 如果在代码中出现了"unexpected reserved word 'await'"错误,可能是以下几种原因: 1. 不支持异步函数的环境:在一些旧的浏览器或Node.js版本中,可能不支持异步函数的语法。解决这个问题的方法是使用经过编译的代码或升级到支持异步函数的环境。 2. 非异步函数中使用了'await':'await'关键字只能在异步函数中使用,如果在非异步函数中使用了'await',就会报错。要解决这个问题,可以将函数改为异步函数,或者将'await'关键字移除。 3. 错误的语法:如果'await'关键字周围的语法不正确,也会导致该错误。可以检查代码中的其他语法错误或拼写错误,以解决该问题。 总之,"unexpected reserved word 'await'"是一个JavaScript语法错误,表示在不支持异步函数的环境或错误的语法下使用了'await'关键字。如果遇到这个错误,可以检查以上的几种原因,并进行相应的修正。 ### 回答3: "unexpected reserved word 'await'"表示出现了意外的保留字'await'。这个错误可能是由于在不支持该关键字的地方使用了'await'导致的。 在JavaScript中,'await'是异步函数中用来等待一个Promise对象进行解决的关键字。它只能在异步函数中使用。当我们在非异步函数或普通代码块中使用'await'时,就会出现上述错误。 要解决这个问题,我们可以检查是否在非异步函数或普通代码块中使用了'await'关键字。如果是的话,我们需要将其放在异步函数中才能正常工作。异步函数可以使用'async'关键字声明。 例如: ```javascript async function getData() { const response = await fetch('https://api.example.com/data'); const data = await response.json(); console.log(data); } getData(); ``` 在上面的例子中,'await'关键字被正确地放置在异步函数内部。这样就可以在等待Promise对象解析后继续执行代码。 总结:要解决"unexpected reserved word 'await'"的错误,需要将使用'await'关键字的代码放在异步函数中,只有在异步函数中才能正常使用'await'。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值