当前位置: 首页 > 知识库问答 >
问题:

javascript - async await执行结束后,希望.then中的方法也一并执行完毕,再跳出方法,要如何操作?

汤枫涟
2024-05-07

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里面的方法执行完毕后,父组件再去调用新一次的循环

共有2个答案

薛烨霖
2024-05-07

父组件用 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(....)
弘兴言
2024-05-07

要确保.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进程之后执行函数。因为目前数据已经发送,但还没有时间填充。 谢谢你的帮助