gpt4 book ai didi

javascript - 这是 promise 中错误处理的正确用法吗?

转载 作者:行者123 更新时间:2023-12-03 03:58:54 24 4
gpt4 key购买 nike

我很难理解处理错误的最佳方法。下面的代码是一个好的做法吗?

有没有更好、更短、更容易阅读的方法来处理流程和错误?

如何编写代码来处理所有错误,以免错误被吞噬?谢谢。

  privateProperties.setSearchedData = function (data, searchFor) {
return new Promise(function (resolve, reject) {
switch (searchFor) {
case "photos":
try {
var photoItems = [];

if (data.items && data.items.constructor === Array) {
data.items.forEach(function (value) {
if (value.link) {
photoItems.push(value.link);
} else {
console.error('Link is undefined');
reject(new Error('Link is undefined'));
}
});
privateProperties._uiInstances['main'].uiReference.set("photos.photoItems",photoItems)
.then(resolve(photoItems))
.catch(function (error) {
reject(error);
})
} else {
reject(new Error('Data.items is undefined or not array'));
}
} catch (e) {
throw e;
}
break;

case "videos":
break
}
});

};

最佳答案

如果我正确理解你的代码,你可以这样写:

privateProperties.setSearchedData = function(data, searchFor) {
switch (searchFor) {

case "photos":
if (!Array.isArray(data.items))
return Promise.reject("data.items is undefined or not an array");

const photoItems = data.items.map(item => item.link);

if (photoItems.some(item => !item)) {
console.error('Link is undefined');
return Promise.reject("Link is undefined");
}

return privateProperties._uiInstances['main'].uiReference
.set("photos.photoItems", photoItems);

case "videos":
return Promise.reject("videos not supported");
}
}

您本质上是在尝试返回 uiReference.set promise ,因此只需返回它即可。不需要从中捕获拒绝——拒绝将被传递给消费者来处理。无需创建自己的 Promise,然后根据其结果费力地解决拒绝您自己的新 Promise。只需返回你想要的 promise 即可。可以预先完成错误检查,并在这种情况下返回显式拒绝的 promise 。

使用await,这可能如下所示。您可以抛出而不是返回Promise.rejectthrow 将导致函数返回一个被拒绝的 Promise,并以此作为原因。

privateProperties.setSearchedData = async function(data, searchFor) {
switch (searchFor) {
case "photos":
return privateProperties._uiInstances['main'].uiReference
.set("photos.photoItems", data.items.map(item => item.link));

case "videos":
throw new Error("videos not supported");
}
}

我省略了对数组的检查,因为非数组将导致 .map 失败,这将导致整个函数返回因某种原因而被拒绝的 promise ,例如“无法读取 null 的属性 map

我还假设重新设计了 uiReference.set 来检查丢失或空链接,并在发生这种情况时拒绝,因此我们不必检查链接是否全部那里也有。总而言之,这个函数实际上只需要打开 searchFor,从数据项中提取链接,然后调用并返回 uiReference.set 。就我个人而言,我更喜欢有单独的功能来搜索照片和视频,这样它就会变得非常干净:

privateProperties.setSearchedPhotosData = async function(data) {
return privateProperties._uiInstances['main'].uiReference
.set("photos.photoItems", data.items.map(item => item.link));
}

async 唯一剩下的目的是将 map 的失败(当 data.items 不是数组时)转换为拒绝的 promise 。但是,如果这种情况代表编码错误,而不是您想要处理的半预期情况,那么最好让它抛出(通过删除 async)。

关于javascript - 这是 promise 中错误处理的正确用法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com