async await 以及.then 希望.then中的方法也一并执行到底,不要在执行完毕await之后就跳出来,最后再执行.then中的方法。
// 父组件调用子组件方法this.identifyFailed.forEach((alarm: Alarm, index: number) => { this.$nextTick(()=>{ this.$refs['slideImageFaildRef'][index].initFilePath(alarm.id) })})
// 子组件实现如下所示
// 通过id获取告警图片async initFilePath(alarmId) { this.isShowMoreWaterfallImage = false; const { code, data } = await getImagePathOfAlarmAsync(alarmId) if (code == 200) { this.dealImageData(data) } else { this.showType = 1 } }
async dealImageData(data, id = 'alarmId') { this.imgList = [] this.carouselCurrentIndex = 0 this.imagePaths = data this.imageFormPathId = id this.showType = this.imagePaths.length == 0 ? 1 : (this.imagePaths.length == 1 ? 2 : 3) if (this.showType !== 1) { let promiseList = Promise.all(this.imagePaths.map(async(path) => { return this.loadImgaePath(path) })) await promiseList.then(async (data: any)=>{ this.imgList = data this.$nextTick(()=>{ if (this.showType === 2) { if (!!this.$refs.imageRef) this.$refs.imageRef.loadImage(data[0]) } else if (this.showType === 3 ) { data.forEach((image: any, index: number) => { if (!!this.$refs[`imageRef${index}`][0]) this.$refs[`imageRef${index}`][0].loadImage(image) }) } }) }) }}loadImgaePath(path) { return new Promise(async(resolve, reject) => { await request({ url: path, method: 'get', responseType: 'arraybuffer' }).then((response: any) => { let imgSrc = "data:image/jpeg;base64," + btoa(new Uint8Array(response.data).reduce((data, byte) => data + String.fromCharCode(byte), "")) resolve(imgSrc) }).catch(()=>{ reject() }) })}
在dealImageData方法中,得到promiseList,希望promiseList.then里面的方法执行完毕后,父组件再去调用新一次的循环
父组件用 forEach 调用子组件的异步方法,会同时运行,并且不会等待。你需要用 map 返回一个promise的列表,然后再等待异步完成。
const initPromises = this.identifyFailed.map(async (alarm: Alarm, index: number) => { await this.$nextTick() returen await this.$refs['slideImageFaildRef'][index].initFilePath(alarm.id)})Promise.all(initPromises).then(....)
要确保.then
中的方法执行完毕后再跳出当前方法,并且父组件在新一轮的循环中等待所有子组件的.then
方法完成,你可以使用Promise.all
来管理这些异步操作。下面是一个修改后的示例,展示了如何实现这个需求:
首先,在子组件的initFilePath
方法中,返回一个Promise
,这样父组件可以等待这个Promise
完成:
// 子组件initFilePath(alarmId) { return new Promise((resolve, reject) => { this.isShowMoreWaterfallImage = false; getImagePathOfAlarmAsync(alarmId) .then(({ code, data }) => { if (code == 200) { this.dealImageData(data) .then(() => resolve()) // 当dealImageData完成后,解决这个Promise } else { this.showType = 1; reject(); // 如果出错,拒绝这个Promise } }) .catch(reject); // 如果getImagePathOfAlarmAsync出错,拒绝这个Promise });}// 其他方法保持不变...
然后,在父组件中,你可以使用Promise.all
来等待所有子组件的initFilePath
方法完成:
// 父组件this.identifyFailed.forEach((alarm, index) => { // 保存每个Promise,以便稍后使用Promise.all const initPromises = []; this.$nextTick(() => { this.$refs['slideImageFaildRef'][index].initFilePath(alarm.id) .then(() => { // 在每个initFilePath完成后,将Promise添加到数组中 initPromises.push(Promise.resolve()); }) .catch((error) => { console.error(`Error initializing image for alarm ${alarm.id}:`, error); // 如果需要,可以在这里处理错误,或者跳过出错的项 }); });});// 等待所有initFilePath完成Promise.all(initPromises) .then(() => { // 当所有initFilePath都完成后,执行新一轮的循环或其他操作 console.log('All images initialized, proceed with next step...'); // 这里可以调用新的循环或执行其他需要的逻辑 }) .catch((errors) => { // 如果其中有任何错误,这里会捕获到 console.error('Errors occurred while initializing images:', errors); });
注意,Promise.all
会等待所有传入的Promise
都完成(或者其中一个被拒绝)才会解析或拒绝。因此,当所有子组件的initFilePath
方法都完成后,Promise.all(initPromises)
会解析,然后你可以执行接下来的逻辑。
确保在initFilePath
方法中正确处理任何可能的错误,并在父组件中捕获并处理这些错误,以避免程序意外中断或产生不可预测的行为。
我有3种方法需要并行运行,因为它们彼此独立,并在最后合并每种方法的结果,并将其作为响应发送。我还需要处理异常。 在不同的帖子中,我找到了下面的代码并进行了相应的修改。 上述各项是否应正确并行运行?我知道这需要更多的时间,我想确保我做对了。
问题内容: 我有一个http服务器(使用启动),我想做一些操作。 我该怎么做(在Linux上)?在ctrl-C的情况下可以进行那些操作吗? 我不熟悉Unix信号,因此答案可能很简单。 问题答案: 您可以使用信号包订购TERM和INT信号。但是请注意,只有在明确终止进程时才发送这些信号。正常退出(由流程本身启动)不涉及任何信号。我认为,对于正常退出,只需在主例程中执行某些操作即可(该例程应该生成工作
gin 的ctx.Stream 为啥不起作用,也就是说必须要等控制器方法执行完成后,ctx.Stream 输出才会一次性的依次性输出?
本文向大家介绍PostgreSQL查看正在执行的任务并强制结束的操作方法,包括了PostgreSQL查看正在执行的任务并强制结束的操作方法的使用技巧和注意事项,需要的朋友参考一下 查看任务sql语句: 其中 procpid:进程id start:进程开始时间 lap:经过时间 current_query:执行中的sql 强制停止某一个任务: SELECT pg_cancel_backend(进程i
我已经使用testng并行测试用例执行设置,但我只需要执行一次设置方法。 BeforeClass和BeforeMethod也会针对单个线程执行。但我需要在所有线程之前执行一次方法。 如何通过TestNG设置实现这一点? 测试NG。xml
我正在Java的Android应用程序中工作,其中调用类并在OnCreateView方法中进行测量。然而,一旦完成,我必须自动发送他的测量结果。但我不能。是否有继承自:java.lang.对象android.app.片段的方法,可以在OncreateView进程之后执行函数。因为目前数据已经发送,但还没有时间填充。 谢谢你的帮助