【发布时间】:2015-08-27 10:03:55
【问题描述】:
对 es6 还很陌生,很想知道现在是否可以使用 Promises,我可以取消 future.wait()
我有一个名为execute() 的方法,它启动了一系列承诺。我对这种方法有两个要求:
- 每个promise 应该只在最后一个promise 完成后开始(这部分我已经实现了)
-
execute()应该只在整个 Promise 链完成执行时返回(即我想阻塞直到最后一个 Promise 完成)
这是我的示例代码:
/* Require dependencies */
require('babel/polyfill');
class PromiseWaiter {
/* Constructor */
constructor() {
}
/* Methods */
execute() {
let _this = this;
runPromiseGenerator(function *promiseGenerator() {
yield _this.asyncMethod1();
yield _this.asyncMethod2();
yield _this.asyncMethod3();
});
return true;
}
asyncMethod1() {
return returnDummyPromise('method 1', 800);
}
asyncMethod2() {
return returnDummyPromise('method 2', 200);
}
asyncMethod3() {
return returnDummyPromise('method 3', 200);
}
}
var runPromiseGenerator = function(generator) {
var it = generator(), ret;
// asynchronously iterate over generator
(function iterate(val) {
ret = it.next(val);
if (!ret.done) {
// poor man's "is it a promise?" test
if ("then" in ret.value) {
// wait on the promise
ret.value.then(iterate);
}
// immediate value: just send right back in
else {
// avoid synchronous recursion
setTimeout( function(){
iterate(ret.value);
}, 0);
}
}
})();
};
var returnDummyPromise = function(methodName, timeout) {
console.log('starting %s', methodName);
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('finished %s', methodName);
resolve();
}, timeout);
})
};
module.exports = PromiseWaiter;
这是我在节点控制台上运行的测试和当前输出:
> p = new PromiseWaiter()
{}
> p.execute()
starting method 1
true
> finished method 1
starting method 2
finished method 2
starting method 3
finished method 3
我想看到的是:
> p = new PromiseWaiter()
{}
> p.execute()
starting method 1
finished method 1
starting method 2
finished method 2
starting method 3
finished method 3
true
>
过去我会使用
fut = new Future();
// set off chain passing future
future.wait();
想挑选最优秀、最聪明的人。
提前感谢您的宝贵时间! 艾略特
【问题讨论】:
-
为什么要重新实现
runPromiseGenerator?co已经做到了,它使用代码来处理您正在尝试做的事情。你需要runPromiseGenerator来返回一个承诺,所以你可以做runPromiseGenerator(...).then(function(){ console.log('all done'); }); -
future.wait()是什么东西?纤维?你在使用某个特定的库吗?
标签: javascript concurrency ecmascript-6