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)