0

У меня 3 потока. gradingResult и contextId зависят от studentResponse. Мне нужно запустить событие и только одно событие (в противном случае это тривиально), когда все 3 имеют последние значения.Ждать последних значений из зависимых потоков в BaconJS?

Я пробовал #combineTemplate и #sampledBy studentResponse. К сожалению, я всегда вижу неправильные данные --- gradingResult и contextId имеют старые значения в комбинированном шаблоне. Как я могу ждать, пока все потоки будут иметь последние значения?

код показан ниже:

var studentResponse = new Bacon.Bus(); 
var gradingResult = new Bacon.Bus(); 
var contextId = new Bacon.Bus(); 

studentResponse.onValue(function(f) { 
    gradingResult.push(f); 
    contextId.push(f); 
}); 

Bacon.combineTemplate({ 
    studentResponse: studentResponse, 
    gradingResult: gradingResult, 
    contextId: contextId 
}).sampledBy(studentResponse) 
    .onValue(function(t) { 
    console.log(t); 
}); 

studentResponse.push(1); 
studentResponse.push(2); 
studentResponse.push(3); 

Ссылка на jsfiddle: https://jsfiddle.net/3o4c9sm8/1/

UPDATE: это надуманный пример. В реальном коде gradingResult является ajax-запросом. Оба gradingResult и ContextID имеют временные зависимости от studentResponse

+0

Зачем вам нужно подталкивать значения studetResponse к gradingResult и contextId? Кроме того, Bacon.Bus предоставляет метод подключения для подключения потока к шине: https://github.com/baconjs/bacon.js/#bus-plug – JJuutila

+0

Это надуманный пример. В реальном коде gradingResult является ajax-запросом. Да, я знаю #plug. –

+0

Не пытайтесь использовать 'push' внутри' onvalue', я думаю, это то, что испортило атомарность. Скорее используйте что-то вроде 'map()'. Это также может быть полезно, если вы можете показать нам соответствующую выдержку из вашего реального кода. – Bergi

ответ

1

Раствор для образца потоком, который обновляет последним. В этом случае это contextId. Изменение кода на следующее заставляет его работать:

var studentResponse = new Bacon.Bus(); 
var gradingResult = new Bacon.Bus(); 
var contextId = new Bacon.Bus(); 

studentResponse.onValue(function(f) { 
    gradingResult.push(f); 
    contextId.push(f); 
}); 

Bacon.combineTemplate({ 
studentResponse: studentResponse, 
gradingResult: gradingResult, 
contextId: contextId 
}).sampledBy(contextId) //Sampling by stream that updates last <--- 
.onValue(function(t) { 
    console.log(t); 
}); 

studentResponse.push(1); 
studentResponse.push(2); 
studentResponse.push(3); 
0

Похоже закупорки автобусы вместо толкая значение внутри studentResponse.onValue делает трюк:

var studentResponse = new Bacon.Bus(); 
var gradingResult = new Bacon.Bus(); 
var contextId = new Bacon.Bus(); 

gradingResult.plug(studentResponse); 
contextId.plug(studentResponse); 

Bacon.combineTemplate({ 
    studentResponse: studentResponse, 
    gradingResult: gradingResult, 
    contextId: contextId 
}).sampledBy(studentResponse) 
    .onValue(function(t) { 
    console.log(t); 
}); 

studentResponse.push(1); 
studentResponse.push(2); 
studentResponse.push(3); 
+0

Если это было непонятно, этот пример надуман. Вы удалили временную зависимость, которую я не могу сделать в реальном коде –

Смежные вопросы