remove and rename references to <async-fragment> in the code (except deprecated events, tests, and transforms)

This commit is contained in:
Michael Rawlings 2016-06-18 12:49:31 -07:00
parent 22e81c92bb
commit 4c9ceb0aa8
10 changed files with 97 additions and 92 deletions

View File

@ -5,22 +5,22 @@ module.exports = function(input, out) {
out.flush();
var asyncOut = out.beginAsync({ last: true, timeout: -1, name: 'async-fragments' });
var asyncOut = out.beginAsync({ last: true, timeout: -1, name: 'await-reorderer' });
out.onLast(function(next) {
var asyncFragmentsContext = global.__asyncFragments;
var awaitContext = global.__awaitContext;
if (!asyncFragmentsContext || !asyncFragmentsContext.fragments.length) {
if (!awaitContext || !awaitContext.instances.length) {
asyncOut.end();
next();
return;
}
var remaining = asyncFragmentsContext.fragments.length;
var remaining = awaitContext.instances.length;
var done = false;
function handleAsyncFragment(fragmentInfo) {
fragmentInfo.asyncValue.done(function(err, html) {
function handleAwait(awaitInfo) {
awaitInfo.asyncValue.done(function(err, html) {
if (done) {
return;
}
@ -35,17 +35,18 @@ module.exports = function(input, out) {
global._afRuntime = true;
}
asyncOut.write('<div id="af' + fragmentInfo.id + '" style="display:none">' +
asyncOut.write('<div id="af' + awaitInfo.id + '" style="display:none">' +
html +
'</div>' +
'<script type="text/javascript">$af(' +
(typeof fragmentInfo.id === 'number' ? fragmentInfo.id : '"' + fragmentInfo.id + '"') +
(fragmentInfo.after ? (',"' + fragmentInfo.after + '"') : '' ) +
(typeof awaitInfo.id === 'number' ? awaitInfo.id : '"' + awaitInfo.id + '"') +
(awaitInfo.after ? (',"' + awaitInfo.after + '"') : '' ) +
')</script>');
fragmentInfo.out.writer = asyncOut.writer;
awaitInfo.out.writer = asyncOut.writer;
out.emit('asyncFragmentFinish', fragmentInfo);
out.emit('await:finish', awaitInfo);
out.emit('asyncFragmentFinish', awaitInfo); // TODO: remove deprecated event
out.flush();
@ -57,15 +58,15 @@ module.exports = function(input, out) {
});
}
asyncFragmentsContext.fragments.forEach(handleAsyncFragment);
awaitContext.instances.forEach(handleAwait);
out.on('asyncFragmentClientReorder', function(fragmentInfo) {
out.on('await:clientReorder', function(awaitInfo) {
remaining++;
handleAsyncFragment(fragmentInfo);
handleAwait(awaitInfo);
});
// Now that we have a listener attached, we want to receive any additional
// out-of-sync fragments via an event
delete asyncFragmentsContext.fragments;
// out-of-sync instances via an event
delete awaitContext.instances;
});
};

View File

@ -78,7 +78,7 @@ module.exports = function render(input, out) {
dataProvider = dataProvider[method].bind(dataProvider);
}
var fragmentInfo = {
var awaitInfo = {
name: name,
clientReorder: clientReorder,
dataProvider: dataProvider
@ -86,26 +86,28 @@ module.exports = function render(input, out) {
var beforeRenderEmitted = false;
out.emit('asyncFragmentBegin', fragmentInfo);
out.emit('await:begin', awaitInfo);
out.emit('asyncFragmentBegin', awaitInfo); // TODO: remove deprecated event
function renderBody(err, data, renderTimeout) {
if (fragmentInfo.finished) return;
if (awaitInfo.finished) return;
if (timeoutId) {
clearTimeout(timeoutId);
timeoutId = null;
}
var targetOut = fragmentInfo.out = asyncOut || out;
var targetOut = awaitInfo.out = asyncOut || out;
if (!beforeRenderEmitted) {
beforeRenderEmitted = true;
out.emit('asyncFragmentBeforeRender', fragmentInfo);
out.emit('await:beforeRender', awaitInfo);
out.emit('asyncFragmentBeforeRender', awaitInfo); // TODO: remove deprecated event
}
if (err) {
if (input.renderError) {
console.error('Async fragment (' + name + ') failed. Error:', (err.stack || err));
console.error('Await (' + name + ') failed. Error:', (err.stack || err));
input.renderError(targetOut);
} else {
targetOut.error(err);
@ -118,10 +120,11 @@ module.exports = function render(input, out) {
}
}
fragmentInfo.finished = true;
awaitInfo.finished = true;
if (!clientReorder) {
out.emit('asyncFragmentFinish', fragmentInfo);
out.emit('await:finish', awaitInfo);
out.emit('asyncFragmentFinish', awaitInfo); // TODO: remove deprecated event
}
if (asyncOut) {
@ -137,7 +140,7 @@ module.exports = function render(input, out) {
requestData(dataProvider, arg, renderBody, scope);
if (!fragmentInfo.finished) {
if (!awaitInfo.finished) {
var timeout = input.timeout;
var renderTimeout = input.renderTimeout;
var renderPlaceholder = input.renderPlaceholder;
@ -150,9 +153,9 @@ module.exports = function render(input, out) {
if (timeout != null) {
timeoutId = setTimeout(function() {
var message = 'Async fragment (' + name + ') timed out after ' + timeout + 'ms';
var message = 'Await (' + name + ') timed out after ' + timeout + 'ms';
fragmentInfo.timedout = true;
awaitInfo.timedout = true;
if (renderTimeout) {
logger.error(message);
@ -164,12 +167,12 @@ module.exports = function render(input, out) {
}
if (clientReorder) {
var asyncFragmentContext = out.global.__asyncFragments || (asyncFragmentContext = out.global.__asyncFragments = {
fragments: [],
var awaitContext = out.global.__awaitContext || (awaitContext = out.global.__awaitContext = {
instances: [],
nextId: 0
});
var id = fragmentInfo.id = input.name || (asyncFragmentContext.nextId++);
var id = awaitInfo.id = input.name || (awaitContext.nextId++);
if (renderPlaceholder) {
out.write('<span id="afph' + id + '">');
@ -179,28 +182,28 @@ module.exports = function render(input, out) {
out.write('<noscript id="afph' + id + '"></noscript>');
}
var asyncValue = fragmentInfo.asyncValue = new AsyncValue();
var asyncValue = awaitInfo.asyncValue = new AsyncValue();
// If `client-reorder` is enabled then we asynchronously render the async fragment to a new
// If `client-reorder` is enabled then we asynchronously render the await instance to a new
// AsyncWriter instance so that we can Write to a temporary in-memory buffer.
asyncOut = fragmentInfo.out = asyncWriter.create(null, {global: out.global});
asyncOut = awaitInfo.out = asyncWriter.create(null, {global: out.global});
fragmentInfo.after = input.showAfter;
awaitInfo.after = input.showAfter;
var oldEmit = asyncOut.emit;
// Since we are rendering the async fragment to a new and separate AsyncWriter instance,
// Since we are rendering the await instance to a new and separate AsyncWriter instance,
// we want to proxy any child events to the main AsyncWriter in case anyone is interested
// in those events. This is also needed for the following events to be handled correctly:
//
// - asyncFragmentBegin
// - asyncFragmentBeforeRender
// - asyncFragmentFinish
// - await:begin
// - await:beforeRender
// - await:finish
//
asyncOut.emit = function(event) {
if (event !== 'finish' && event !== 'error') {
// We don't want to proxy the finish and error events since those are
// very specific to the AsyncWriter associated with the async fragment
// very specific to the AsyncWriter associated with the await instance
out.emit.apply(out, arguments);
}
@ -215,14 +218,15 @@ module.exports = function render(input, out) {
asyncValue.reject(err);
});
if (asyncFragmentContext.fragments) {
asyncFragmentContext.fragments.push(fragmentInfo);
if (awaitContext.instances) {
awaitContext.instances.push(awaitInfo);
}
out.emit('asyncFragmentClientReorder', fragmentInfo);
out.emit('await:clientReorder', awaitInfo);
out.emit('asyncFragmentClientReorder', awaitInfo); // TODO: remove deprecated event
} else {
out.flush(); // Flush everything up to this async fragment
asyncOut = fragmentInfo.out = out.beginAsync({
out.flush(); // Flush everything up to this await instance
asyncOut = awaitInfo.out = out.beginAsync({
timeout: 0, // We will use our code for controlling timeout
name: name
});

View File

@ -11,7 +11,7 @@ var fs = require('fs');
require('../node-require').install();
describe('render', function() {
describe('async-fragments (deprecated)', function() {
var autoTestDir = path.join(__dirname, 'autotests/async-fragments-deprecated');
autotest.scanDir(

View File

@ -11,7 +11,7 @@ var fs = require('fs');
require('../node-require').install();
describe('render', function() {
describe('async render', function() {
var autoTestDir = path.join(__dirname, 'autotests/async-render');
autotest.scanDir(
@ -43,17 +43,17 @@ describe('render', function() {
var templateData = main.templateData || {};
var out = marko.createWriter();
var events = [];
var eventsByFragmentName = {};
var eventsByAwaitInstance = {};
var addEventListener = function(event) {
out.on(event, function(arg) {
var name = arg.name;
if (!eventsByFragmentName[name]) {
eventsByFragmentName[name] = [];
if (!eventsByAwaitInstance[name]) {
eventsByAwaitInstance[name] = [];
}
eventsByFragmentName[name].push(event);
eventsByAwaitInstance[name].push(event);
events.push({
event: event,
@ -62,9 +62,9 @@ describe('render', function() {
});
};
addEventListener('asyncFragmentBegin');
addEventListener('asyncFragmentBeforeRender');
addEventListener('asyncFragmentFinish');
addEventListener('await:begin');
addEventListener('await:beforeRender');
addEventListener('await:finish');
template.render(templateData, out, function(err, html) {
if (err) {
@ -81,13 +81,13 @@ describe('render', function() {
main.checkEvents(events, helpers);
}
// Make sure all of the async fragments were correctly ended
Object.keys(eventsByFragmentName).forEach(function(fragmentName) {
var events = eventsByFragmentName[fragmentName];
// Make sure all of the await instances were correctly ended
Object.keys(eventsByAwaitInstance).forEach(function(name) {
var events = eventsByAwaitInstance[name];
expect(events).to.deep.equal([
'asyncFragmentBegin',
'asyncFragmentBeforeRender',
'asyncFragmentFinish'
'await:begin',
'await:beforeRender',
'await:finish'
]);
});

View File

@ -1,3 +1,3 @@
<async-fragment data-provider=data.nameDataProvider var="name">
<await(name from data.nameDataProvider)>
Hello ${name}!
</async-fragment>
</await>

View File

@ -1,6 +1,6 @@
[
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "data.outer",
"finished":true,
@ -9,7 +9,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "data.outer",
"finished":true,
@ -18,7 +18,7 @@
}
},
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "data.inner1",
"finished":true,
@ -26,7 +26,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "data.inner1",
"finished":true,
@ -34,7 +34,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "data.inner1",
"finished":true,
@ -42,7 +42,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "data.outer",
"finished":true,

View File

@ -1,6 +1,6 @@
[
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "data.outer",
"finished":true,
@ -9,7 +9,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "data.outer",
"finished":true,
@ -18,7 +18,7 @@
}
},
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "data.inner1",
"finished":true,
@ -27,7 +27,7 @@
}
},
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "data.inner2",
"finished":true,
@ -36,7 +36,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "data.outer",
"finished":true,
@ -45,7 +45,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "data.inner1",
"finished":true,
@ -54,7 +54,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "data.inner1",
"finished":true,
@ -63,7 +63,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "data.inner2",
"finished":true,
@ -72,7 +72,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "data.inner2",
"finished":true,

View File

@ -19,7 +19,7 @@ exports.templateData = {
}
};
exports.checkHtml = function() {}
exports.checkEvents = function(events, helpers) {
events = events.map(function(eventInfo) {
var arg = extend({}, eventInfo.arg);

View File

@ -1,6 +1,6 @@
[
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "data.outer",
"finished":true,
@ -9,7 +9,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "data.outer",
"finished":true,
@ -18,7 +18,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "data.outer",
"finished":true,

View File

@ -1,6 +1,6 @@
[
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "userInfo1",
"clientReorder": false,
@ -9,7 +9,7 @@
}
},
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "userInfo2",
"clientReorder": false,
@ -18,7 +18,7 @@
}
},
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "userInfo3",
"clientReorder": false,
@ -27,7 +27,7 @@
}
},
{
"event": "asyncFragmentBegin",
"event": "await:begin",
"arg": {
"name": "userInfo4",
"clientReorder": false,
@ -36,7 +36,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "userInfo1",
"clientReorder": false,
@ -45,7 +45,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "userInfo1",
"clientReorder": false,
@ -54,7 +54,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "userInfo2",
"clientReorder": false,
@ -63,7 +63,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "userInfo2",
"clientReorder": false,
@ -72,7 +72,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "userInfo3",
"clientReorder": false,
@ -81,7 +81,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "userInfo3",
"clientReorder": false,
@ -90,7 +90,7 @@
}
},
{
"event": "asyncFragmentBeforeRender",
"event": "await:beforeRender",
"arg": {
"name": "userInfo4",
"clientReorder": false,
@ -99,7 +99,7 @@
}
},
{
"event": "asyncFragmentFinish",
"event": "await:finish",
"arg": {
"name": "userInfo4",
"clientReorder": false,