mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-11-04 13:00:10 +00:00 
			
		
		
		
	investigating the sync issue...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									0b133aeeb8
								
							
						
					
					
						commit
						4991dd1bd0
					
				@ -446,8 +446,37 @@ module.BaseParser = {
 | 
				
			|||||||
	//			old code:
 | 
						//			old code:
 | 
				
			||||||
	//				await p.pwiki.parse('<slot moo/>!!! <slot moo>moo</slot>')
 | 
						//				await p.pwiki.parse('<slot moo/>!!! <slot moo>moo</slot>')
 | 
				
			||||||
	//					-> 'moo!!! '
 | 
						//					-> 'moo!!! '
 | 
				
			||||||
	//		...does not seem to affect named macros...
 | 
						//		...this affects @var(..) and @slot(..) and does not affect @macro(..)
 | 
				
			||||||
	_expand: function(page, ast, state={}){
 | 
						//		The problem is that .callMacro(..) is for some execution paths is
 | 
				
			||||||
 | 
						//		called sync and in some paths after the current execution frame is 
 | 
				
			||||||
 | 
						//		done, i.e. async...
 | 
				
			||||||
 | 
						//		...turns out that the problem is in the inconsistent await behavior,
 | 
				
			||||||
 | 
						//		in var macro, as an example, there are two paths: the assign and 
 | 
				
			||||||
 | 
						//		the get, the assign calls .parse(..) and awaits for the result 
 | 
				
			||||||
 | 
						//		while the get path is "sync", this results in the first exec path
 | 
				
			||||||
 | 
						//		getting pushed to the next execution frame while the second is run
 | 
				
			||||||
 | 
						//		in sync with the caller, here is a simplified demo:
 | 
				
			||||||
 | 
						//			console.log(1)
 | 
				
			||||||
 | 
						//			// note that we are NOTE await'ing for the function here...
 | 
				
			||||||
 | 
						//			(async function f(){ 
 | 
				
			||||||
 | 
						//				console.log(2)})()
 | 
				
			||||||
 | 
						//			console.log(3)
 | 
				
			||||||
 | 
						//				-> prints 1, 2, 3
 | 
				
			||||||
 | 
						//		and:
 | 
				
			||||||
 | 
						//			console.log(1)
 | 
				
			||||||
 | 
						//			(async function f(){ 
 | 
				
			||||||
 | 
						//				// note the await -- this is the only difference...
 | 
				
			||||||
 | 
						//				console.log(await 2)})()
 | 
				
			||||||
 | 
						//			console.log(3)
 | 
				
			||||||
 | 
						//				-> prints 1, 3, 2
 | 
				
			||||||
 | 
						//		this could both be a bug or a feature depending on how you look
 | 
				
			||||||
 | 
						//		at it, but it makes promise sequencing very unpredictable...
 | 
				
			||||||
 | 
						//		...another problem here is that in the var macro, simply adding
 | 
				
			||||||
 | 
						//		an await of something does not fix the issue, we need to await 
 | 
				
			||||||
 | 
						//		for something significant -- await this.parse('') works, while
 | 
				
			||||||
 | 
						//		await vars[name] does not -- to the contrary of the above example...
 | 
				
			||||||
 | 
						// XXX EXPERIMENTAL...
 | 
				
			||||||
 | 
						expand: function(page, ast, state={}){
 | 
				
			||||||
		var that = this
 | 
							var that = this
 | 
				
			||||||
		ast = ast == null ?
 | 
							ast = ast == null ?
 | 
				
			||||||
				Promise.awaitOrRun(
 | 
									Promise.awaitOrRun(
 | 
				
			||||||
@ -460,12 +489,8 @@ module.BaseParser = {
 | 
				
			|||||||
				ast
 | 
									ast
 | 
				
			||||||
			: ast.iter()
 | 
								: ast.iter()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// XXX this must execute sequentially for things that depend on 
 | 
							// NOTE this must execute sequentially for things that depend on 
 | 
				
			||||||
		// 		lexical scope not to get lost in the mess...
 | 
							// 		lexical scope not to get lost in the mess...
 | 
				
			||||||
		// 		...or it's a question of if we can maintain "slices" of 
 | 
					 | 
				
			||||||
		// 		state per macro call that is both containing all the state 
 | 
					 | 
				
			||||||
		// 		from previous macros, and is not affected by the changes 
 | 
					 | 
				
			||||||
		// 		done by next macros (unless needed)...
 | 
					 | 
				
			||||||
		return Promise.seqiter(ast, 
 | 
							return Promise.seqiter(ast, 
 | 
				
			||||||
				function(value){
 | 
									function(value){
 | 
				
			||||||
					// text block...
 | 
										// text block...
 | 
				
			||||||
@ -478,6 +503,9 @@ module.BaseParser = {
 | 
				
			|||||||
						return {...value, skip: true} }
 | 
											return {...value, skip: true} }
 | 
				
			||||||
					// macro call...
 | 
										// macro call...
 | 
				
			||||||
					return Promise.awaitOrRun(
 | 
										return Promise.awaitOrRun(
 | 
				
			||||||
 | 
											// XXX due to the unpredictable behavior of await we 
 | 
				
			||||||
 | 
											// 		need to call this only AFTER the previous call
 | 
				
			||||||
 | 
											// 		is done...
 | 
				
			||||||
						that.callMacro(page, name, args, body, state),
 | 
											that.callMacro(page, name, args, body, state),
 | 
				
			||||||
						function(res){
 | 
											function(res){
 | 
				
			||||||
							res = res ?? ''
 | 
												res = res ?? ''
 | 
				
			||||||
@ -508,7 +536,7 @@ module.BaseParser = {
 | 
				
			|||||||
									.replace(/=/g, '=')
 | 
														.replace(/=/g, '=')
 | 
				
			||||||
							+'")') })
 | 
												+'")') })
 | 
				
			||||||
				.sync() },
 | 
									.sync() },
 | 
				
			||||||
	//*/
 | 
						/*/
 | 
				
			||||||
	expand: async function*(page, ast, state={}){
 | 
						expand: async function*(page, ast, state={}){
 | 
				
			||||||
		try{
 | 
							try{
 | 
				
			||||||
			ast = ast == null ?
 | 
								ast = ast == null ?
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user