【发布时间】:2014-08-19 19:50:08
【问题描述】:
我有一个函数 connectImpl 在多个地方引用。我正在尝试调用这个promise,并通过生成器的中介将其值同步返回给调用函数。如果我在生成器上调用 .next() ,它将以挂起状态返回
{ value: { state: 'pending' }, done: false }
我想等待这个生成器的值,直到它不再挂起。我尝试了多个版本的 waitOn 来完成此操作,但似乎无法使其正常工作。
我愿意接受实施建议。这让我有点发疯。令人惊讶的是,promise 的最终创建日志稍后会在执行链中触发 - 在生成器完成之后。我显然错过了一些东西:
let models = null ;
let connectImpl = function() {
console.log('connectImpl')
let orm = setupImpl()
let config = getConfigImpl()
let qInitialize = q.nbind(orm.initialize, orm)
if(models) {
console.log('connectImpl:cached')
return q(models)
} else {
console.log('connectImpl:create')
return qInitialize(config).then(function(m){
console.log('connectImpl:created')
models = m
return models
})
}
}
let waitOn = function(generator){
console.log('waitOn')
let done = false ;
let generatorValue = null
while(!done){
var generatorResult = generator.next()
console.log(generatorResult)
done = generatorResult.done
generatorValue = generatorResult.value
}
return generatorValue
}
let domainImpl = function() {
console.log('domainImpl')
let getConnection = function *() {
console.log('domainImpl:getConnection')
yield connectImpl()
}
var generator = getConnection()
return waitOn(generator)
}
console.log('START')
console.log(domainImpl())
console.log('END')
我可以调用并获取
START
domainImpl
waitOn
domainImpl:getConnection
connectImpl
connectImpl:create
{ value: { state: 'pending' }, done: false }
{ value: undefined, done: true }
undefined
END
connectImpl:created
我可以通过这个函数添加执行 connectImpl 承诺以与中间件一起工作 - 但我似乎无法适应我的上述用例:
let domainMiddlewareImpl = function () {
return function *(next) {
let models = yield connectImpl()
this.request.models = models.collections;
this.request.connections = models.connections;
yield next
};
};
【问题讨论】:
标签: javascript generator promise