(这不是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);
}
})
}
如何以允许我访问抛出异常的元素的方式编写promises,以便将其存储在有问题的元素列表中?
答案 0 :(得分:1)
这是因为传递给catch的匿名函数只能通过闭包访问entity
。
如果entity是一个基本类型,你可以通过构造一个新函数来轻松解决这个问题,该函数通过一个param捕获这个值(其中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只接收返回的函数作为参数)
如果entity是一个对象(仅通过引用传递),则可以使用相同的基本原则,但是您必须创建此实体的副本,这将稍微复杂一些。在这种情况下,如果您使用原语i
编写错误处理程序(使用上述方法很容易捕获它的原始类型),或者如果您不使用原始类型,则可能更容易。 t在循环中重用实体变量。
var entity = Structure.model(entity_type)[1].forge();
- &gt;这里1
不应该是i
?