我想我可能对承诺过于幻想。我有一系列鹅,并且在返回最终值之前我想执行任意数量的操作。我发现在第一个return语句之后,链条被破坏了。如果我的集合有10个项目,那么将在数据库中放置10个项目,但是当我尝试从下面的“return Q.all(promises)”语句构建我的API响应时,我得到空值。
为了测试,我将一个console.log语句放在一个promise中,该promise在第一个之后触发,而一个console.log在我的expressjs路由中,它正在期待鹅的详细信息。 API响应总是首先完成“[null,null]”,然后我最终获得链中第2和第3个承诺的条目。
我是如何创建这种竞争条件的,我该如何修复它?
var promises = geese.map(function(goose) {
determineGooseType(goose.details)
.then(function(type) {
return recordNewGooseType(type)
})
.then(function(dbInsertResult) {
we never really got here!
})
.catch(function(err) {
log some stuff
});
}
return Q.all(promises);
答案 0 :(得分:1)
这意味着有两种选择:
recordNewGooseType
未正确宣传或determineGooseType
。具体而言 - 既然您说API响应determineGooseType
返回[null, null]
,唯一合理的假设是recordNewGooseType
应该受到指责。
这意味着已宣传的recordNewGooseType
未调用resolve
。
你可以通过在一只鹅而不是10只鹅身上运行来验证这一点。
答案 1 :(得分:1)
你没有一系列的承诺,你有一系列undefined
值(Q.all
没有警告过你):你的映射器函数没有返回任何东西。您在那里错过了return
声明:
var promises = geese.map(function(goose) {
return determineGooseType(goose.details)
//^^^^^^
.then(function(type) {
return recordNewGooseType(type)
})
.then(function(dbInsertResult) {
// now getting here before resolving the .all() promise!
})
.catch(function(err) {
log some stuff
});
}
return Q.all(promises);