gpt4 book ai didi

javascript - node.js promise : how to find out which iteration threw the exception in a . catch 语句?

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:23 25 4
gpt4 key购买 nike

(这不是 JavaScript closure inside loops – simple practical example 的重复,因为您无法选择 catch 函数采用哪些参数)

我对 Node.js 的异步回调性质很陌生。我试图找出 for 循环中的哪个元素引发了异常。

当前代码始终返回数组中的最后一个元素,无论哪个元素引发异常。

for (i = 0; i < output.length; i++) {
var entity = Structure.model(entity_type)[1].forge();

/* do some stuff here which I've taken out to simplify */

entity.save()
.then(function(entity) {
console.log('We have saved the entity');
console.log(entity);
returnObj.import_count++;
})
.catch(function(error) {
console.log('There was an error: ' + error);
console.log('value of entity: ', entity); /* THIS entity variable is wrong */
returnObj.error = true;
returnObj.error_count++;
returnObj.error_items.push(error);
})
.finally(function() {
returnObj.total_count++;
if (returnObj.total_count >= output.length) {
console.log('We have reached the end. Signing out');
console.log(returnObj);
return returnObj;
} else {
console.log('Finished processing ' + returnObj.total_count + ' of ' + output.length);
}
})
}

如何编写 Promise,使我能够访问引发异常的元素,以便将其存储在有问题的元素列表中?

最佳答案

发生这种情况是因为传递给 catch 的匿名函数只能通过闭包访问实体

如果实体是原始类型,您可以通过构造一个新函数来轻松解决这个问题,该函数通过参数捕获该值(其中 entity 的值将在构造时复制)。

.catch(function(entity){ 
return function(error) {
console.log('There was an error: ' + error);
console.log('value of entity: ', entity); /* THIS entity variable is wrong */
returnObj.error = true;
returnObj.error_count++;
returnObj.error_items.push(error);
};
}(entity))

(请注意,我使用 () 立即调用该函数,因此 catch 仅接收返回的函数作为参数)

如果实体是一个对象(仅通过引用传递),您可以使用相同的基本原理,但您必须创建该实体的副本,这会稍微复杂一些。在这种情况下,如果您使用基元 i 编写错误处理程序(作为基元类型,很容易使用上述方法捕获),或者不在循环中重用实体变量,则可能会更容易。

顺便说一句,您确定 varEntity = Structure.model(entity_type)[1].forge();-> 这里的 1 不应该是 i 吗?

关于javascript - node.js promise : how to find out which iteration threw the exception in a . catch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31204801/

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