node.js promises:如何找出哪个迭代在.catch语句中引发了异常?

时间:2015-07-03 10:40:41

标签: javascript node.js exception callback promise

(这不是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,以便将其存储在有问题的元素列表中?

1 个答案:

答案 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