Javascript 异步方法中的对象循环

Javascript 异步方法中的对象循环,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我有一个像这样的对象,它存储了一些属性: 基本上,我需要的是循环遍历这个对象,并获得每个键的file属性,我稍后将在代码中使用这些属性来生成多个视频组件。我试图使用map()函数,但该站点将因错误而崩溃: Parsing error: Can not use keyword 'await' outside an async function. 即使我正在使用的代码示例位于async函数中 这是我的密码: const response = await dataProvi

我有一个像这样的对象,它存储了一些属性:

基本上,我需要的是循环遍历这个对象,并获得每个键的
file
属性,我稍后将在代码中使用这些属性来生成多个
视频组件。我试图使用
map()
函数,但该站点将因错误而崩溃:

Parsing error: Can not use keyword 'await' outside an async function.
即使我正在使用的代码示例位于
async
函数中

这是我的密码:

            const response = await dataProvider(GET_MANY, 'vid', { ids: videoId })
            const file = response.data;
            file.map( source => {
                var videoPosition = 0;
                var sigkey = "sigkey";
                var formBody = new FormData();
                formBody.set('ver', "1.2");
                formBody.set('key', "key");
                formBody.set('video_id', file[videoPosition].file);
                formBody.set('user_id', "1234");
                formBody.set('format', "json");
                formBody.set('ip', "");
                formBody.set('tts', "0");
                formBody.set('nonce', Math.round((new Date()).getTime() / 1000));

                var sign_fields = [formBody.get('video_id'), formBody.get('user_id'), formBody.get('ip'), formBody.get('tts'), formBody.get('ver'), formBody.get('key'), formBody.get('nonce')];
                var data = sign_fields.join(':');
                var signature = hmacsha256(data, sigkey);

                formBody.set('sig', signature);

                var formBodyStringified = new URLSearchParams(formBody).toString();

                const resJson = await fetch(Config.api.livebox, {
                    method: 'POST',
                    body: formBodyStringified,
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                    }
                }).then(res => res.json());
                const finalJsonUrl = 'https:' + resJson.hls;
                this.setState({ videoSource: finalJsonUrl });
                videoPosition++;
            });
有什么建议可以让我在对象中循环吗


提前感谢。

即使在映射函数中也应该包含一个异步标记:

file.map(async source => {
                var videoPosition = 0;
                var sigkey = "sigkey";
                var formBody = new FormData();
                formBody.set('ver', "1.2");
                formBody.set('key', "key");
                formBody.set('video_id', file[videoPosition].file);
                formBody.set('user_id', "1234");
                formBody.set('format', "json");
                formBody.set('ip', "");
                formBody.set('tts', "0");
                formBody.set('nonce', Math.round((new Date()).getTime() / 1000));

                var sign_fields = [formBody.get('video_id'), formBody.get('user_id'), formBody.get('ip'), formBody.get('tts'), formBody.get('ver'), formBody.get('key'), formBody.get('nonce')];
                var data = sign_fields.join(':');
                var signature = hmacsha256(data, sigkey);

                formBody.set('sig', signature);

                var formBodyStringified = new URLSearchParams(formBody).toString();

                const resJson = await fetch(Config.api.livebox, {
                    method: 'POST',
                    body: formBodyStringified,
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
                    }
                }).then(res => res.json());
或者您可以使用:


在此行中使用
wait

const resJson = await fetch(Config.api.livebox) 

但这不是正确的用法。因为父函数是
map
回调函数,并且它不是异步的

使用
而不是地图。另外,您没有使用map的返回,因此forEach会更符合逻辑。将所有代码放在一个带有关键字
async
的函数中。在
async
函数中,您可以尽可能多地使用
wait
您的
wait fetch
不会出现在
async
函数中。您需要在传递给
response.map
的回调之前包含
async
关键字,我还建议你把地图放在@Keith的里面,你介意贴个例子吗?我真的不擅长循环。但请注意,这将并行执行所有映射元素。而且还会丢失错误处理。我想从代码判断,这就是PO想要的。如果并发是一个问题,我会使用promise.allI,我会使用
file.map(async(source)=>{
”,因为更清楚的是,我们定义了一个函数,您会有更好的性能,但就像@Keith提到的,如果管理不当,您会遇到问题。如果不努力限制并发,这可能是灾难性的。
const resJson = await fetch(Config.api.livebox)