我正在尝试使用生成器创建一个promise-wrapper,以便我可以这样做:
var asyncResult = PromiseWrapper( $.ajax( ... ) );
到目前为止,我一直在尝试:
function PromiseWrapper(promise){
return function *wrapper(promise){
promise.then(function(result){
yield result;
}, function(err){
throw err;
});
}(promise).next().value
}
但是这会失败,因为不允许在法线内屈服。 这有什么解决方法吗?谢谢:D
ps:我正在使用babel将代码从es6转换为es5
答案 0 :(得分:6)
完全不可能在同步产生promise结果的生成器中包装promise,因为promises总是异步的。没有解决方法,除非你在异步中抛出像光纤这样的强大武器。
答案 1 :(得分:3)
这种方法对您有效吗http://davidwalsh.name/async-generators?
链接中的修改示例:
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
您应该阅读该帖子的全部内容,runGenerator
是一种非常巧妙的方法。
答案 2 :(得分:-1)
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 );
}
})