当我的系统创建错误时,这些错误将被收集并最终发送到票证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不是函数!?
也许是另一种方法?

最佳答案

onError返回一个取消订阅的函数(它没有onEnd函数:“就像订阅一样,该方法通过一个https://baconjs.github.io/api.html#observable-onerror返回一个用于取消订阅的函数。”),而不是一个eventstream(具有)。

尝试这个:

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

createTicketWrapper(msg,fnResolve,fnReject){
    var stream =培根
    .fromArray(门票)
    .bufferingThrottle(2000)
    .flatMap(function(ticket){
        返回sendToTicketAPI(ticket)
        .then(function(){
            往返票;
        });
    });

    stream.onError(function(err){
        console.error('意外错误消息',err);
        如果(fnReject)
            fnReject();
    })
    stream.onEnd(function(){
        如果(fnResolve)
            fnResolve()
    });
}


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

08-28 08:48