Is it possible to wrap a promise inside a generator?

I am trying to create a promise wrapper using a generator so that I can:

var asyncResult = PromiseWrapper( $.ajax( ... ) ); 

So far I have tried:

 function PromiseWrapper(promise){ return function *wrapper(promise){ promise.then(function(result){ yield result; }, function(err){ throw err; }); }(promise).next().value } 

but this fails because damage inside the normal is prohibited. Is there any work for this? Thanks: D

ps: I use babel to translate code from es6 to es5

+6
source share
3 answers

It is completely impossible to wrap a promise in a generator that synchronously produces the result of the promise, because promises are always asynchronous. There is no workaround for this unless you throw away more powerful weapons, such as fibers with asynchrony.

+5
source

Will this approach work for you http://davidwalsh.name/async-generators ?

Modified example from the link:

 function wrap(promise) { promise.then(function(result){ it.next( result ); }, function(err){ throw err; }); } function *main() { var result1 = yield wrap( $.ajax( ... ) ); var data = JSON.parse( result1 ); } var it = main(); it.next(); // get it all started 

You should probably read this entire entry, runGenerator is a pretty neat approach.

+3
source
 function step1(){ return new Promise(function(c,e){ setTimeout(function(){ c(`1000 spet 1`); },1000) }) } function step2(){ return new Promise(function(c,e){ setTimeout(function(){ c(`100 spet 2`); },10000) }) } function step3(){ return new Promise(function(c,e){ setTimeout(function(){ c(`3000 spet 3`); },3000) }) } function step4(){ return new Promise(function(c,e){ setTimeout(function(){ c(`100 spet 4`); },100) }) } function *main() { var ret = yield step1(); try { ret = yield step2( ret ); } catch (err) { ret = yield step2Failed( err ); } ret = yield Promise.all( [ step3( ret ) ] ); yield step4( ret ); } var it = main(); /* while (true) { var current = it.next(); if (current.done) break; console.log(current.value); } */ Promise.all( [ ...it ] ) // Convert iterator to an array or yielded promises. .then( function handleResolve( lines ) { for ( var line of lines ) { console.log( line ); } }) 
0
source

Source: https://habr.com/ru/post/986110/


All Articles