一、 onUnload 不能再调用 editorCtx.getContents
项目场景:
笔记页面使用富文本,在笔记中记载后返回时,要提示新建笔记成功toast
问题描述
安卓可以提示toast,但是ios不行。
js
async onUnload() {
try {
await this.checkAndHandleEmptyNote();
} catch (error) {
console.error('onUnload error:', error);
}
if (this.debounceTimer) {
clearTimeout(this.debounceTimer);
}
},
async checkAndHandleEmptyNote() {
// 获取当前editor中的纯文本内容
let textContent = '';
if (this.editorCtx) {
try {
textContent = await new Promise((resolve) => {
this.editorCtx.getContents({
success: (res) => {
resolve(res.text || TextUtils.htmlToText(res.html || ''));
},
fail: () => {
resolve(TextUtils.htmlToText(this.data.content));
}
});
});
} catch (error) {
textContent = TextUtils.htmlToText(this.data.content);
}
} else {
textContent = TextUtils.htmlToText(this.data.content);
}
const isEmpty = !this.data.title.trim() && !textContent.trim();
if (this.data.delete) {
this.refreshNoteListPage();
return;
}
if (isEmpty && this.data.isNewNote && this.data.id != '0') {
this.deleteEmptyNoteDirectly();
} else if (this.data.isContentModified) {
// 有内容的笔记,先同步到服务器,然后刷新列表
if (this.data.isNewNote) {
wx.showToast({
title: '笔记创建成功',
icon: 'none'
})
}
this.syncToServer().then(() => {
this.refreshNoteListPage();
});
}
},
原因分析:
刚开始以为是因为iOS 小程序在 onUnload 中调用 wx.showToast 不生效,但是通过调试后发现,isEmpty并没有输出. --> 执行流程被中断了,中断点只可能在editorCtx.getContents 这行。
onUnload 调用这一段,iOS 会直接中断 editorCtx 的任何异步操作。
包括 getContents,不会执行 success 或 fail → Promise 不 resolve → 函数永远卡住
富文本编辑器 editorCtx 异步 API 在 onUnload 内不可靠,尤其 iOS 会直接不执行。
解决方案:
进入 onUnload 前,把 editor 内容保存到 data。
js
onContentInput(e) {
let plainText = e.detail.text;
this.data.latestText = plainText; // <-- 新增缓存
}
async checkAndHandleEmptyNote() {
const text = this.data.latestText || '';
const isEmpty = !this.data.title.trim() && !text.trim();
console.log('isEmpty', isEmpty);
...
}