我只是有一个关于 JS 代码执行顺序的基本问题。
deleteAttachement({ cdId, paId: recordId }).then(response => {
if (response) {
this.existingFilesList = this.existingFilesList.filter(file => (file.contentVersionId != cvId));
}
if(this.existingFilesList.length == 0) {
this.statusIcon = this.missingIcon;
}
}).catch(err => {
console.log(err);
});
我试图根据成员变量“this.existingFilesList”(它是一个数组)中包含的记录数量来更改图标。
我只是想知道在上面的代码中,第二个 if 条件等待直到 this.existingFilesList.filter() 函数完成并且成员变量被更新,或者 filter() 函数只是在后台异步运行并且一旦它被称为,if 条件几乎同时被调用,而无需等待 this.existingFilesList 更新。
好像可以用,等待中,但我不确定是不是因为记录量太少了
this.existingFilesList.filter(file => (file.contentVersionId != cvId));
JavaScript 中的每个函数调用总是 立即返回一个值。 (除非抛出异常,但我希望这是显而易见的。)
值可能是
undefined
或 Promise
,但总是会返回一个值。
如果值是
Promise
而您期望的是数组或其他一些值,那么您的代码中存在错误。您需要使用 .then(callback)
或 await
等待 Promise 解决。
所以,您问题的简短答案取决于您所说的“this.existingFilesList.filter() 函数finishes”的意思。
我假设
existingFilesList
是一个常规数组,在这种情况下 filter
同步执行,所以简单的答案是“是的......第二个 if 条件等待直到 this.existingFilesList.filter() 函数完成。”
但是,如果
existingFilesList
是一些自定义对象或类,并且 filter()
返回一个 Promise,那么您就会遇到错误,因为 this.existingFilesList
将被设置为返回的 Promise
而“第二个 if 条件”将 not 等待 Promise 被解决。它将继续进行卡车运输,this.existingFilesList.length == 0
将评估为 false
因为 undefined == 0
是 false
.
一些免费的建议:
如果可能的话,我强烈建议使用
async
和await
关键字。更容易阅读和理解正在发生的事情并导致更少的错误。 (例如,如果您的 existingFilesList
不是数组,并且 filter
返回一个 Promise
,那么您可以在它前面添加一个 await
而无需启动新的 .then()
链)
async function deleteStuff() {
try {
const response = await deleteAttachement({ cdId, paId: recordId });
if (response) {
this.existingFilesList = this.existingFilesList.filter(file => (file.contentVersionId != cvId));
}
if(this.existingFilesList.length == 0) {
this.statusIcon = this.missingIcon;
}
} catch (err) {
console.log(err);
}
}