Bacon.onEnd不是一个功能

时间:2016-04-13 13:16:23

标签: node.js promise bacon.js

当我的系统创建错误时,会收集这些错误并最终发送到故障单API。所有错误都按其优先级类型分组。因此,如果抛出两种不同的错误类型,则应发送两张票。

看起来像:

var tickets = [{ 
    type: 'validation',
    component: 1,
    time: '2016-04-13T10:26:41.420Z',
    messages: [ [Object], [Object], [...] ]
}, { 
    type: 'fatal',
    component: 1,
    time: '2016-04-13T10:26:41.420Z',
    messages: [ [Object] ]
}];

该数组中的每个对象都应该一个接一个地发送,延迟2秒。 sendToTicketAPI()返回一个Promise,我还希望在发送所有票证时返回一个promise。我的想法是,我可以用.onEnd / .onError解析/拒绝它。

代码是:

var Bacon = require('baconjs'); //v0.7.71

createTicketWrapper(msg, fnResolve, fnReject) {
    Bacon
    .fromArray(tickets)
    .bufferingThrottle(2000)
    .flatMap(function (ticket) {
        return sendToTicketAPI(ticket)
        .then(function () {
            return ticket;
        });
    })
    .onError(function (err) {
        console.error('Unexpected error msg', err);
        if (fnReject)
            fnReject();
    })
    .onEnd(function () {
        if (fnResolve)
            fnResolve()
    });
}

但我得到了:

[TypeError: Bacon.fromArray(...).bufferingThrottle(...).flatMap(...).onError(...).onEnd is not a function]

我不明白为什么.onEnd不是一个功能!? 也许是另一种方法?

1 个答案:

答案 0 :(得分:3)

onError返回一个unsubscribe函数(它没有onEnd函数:"就像subscribe一样,这个方法返回一个取消订阅的函数。" via https://baconjs.github.io/api.html#observable-onerror),而不是一个eventstream(一样)。

试试这个:

var Bacon = require('baconjs'); //v0.7.71

createTicketWrapper(msg, fnResolve, fnReject) {
    var stream = Bacon
    .fromArray(tickets)
    .bufferingThrottle(2000)
    .flatMap(function (ticket) {
        return sendToTicketAPI(ticket)
        .then(function () {
            return ticket;
        });
    });

    stream.onError(function (err) {
        console.error('Unexpected error msg', err);
        if (fnReject)
            fnReject();
    })
    stream.onEnd(function () {
        if (fnResolve)
            fnResolve()
    });
}

请注意,我将从flatMap创建的事件流分配给变量,然后使用它分别订阅onError和onEnd。