我的nodejs代码中有一个承诺链,我无法理解为什么第二个'然后'部分正在第一个'然后'之前执行。部分完成它的执行。有人可以帮我理解下面的代码有什么问题。
.then(model=>{
return mongooseModel.find({})
.then(result=>{
return _.each(model.dataObj,data=>{
return _.each(data.fields,field=>{
if(_findIndex(result, {'field.type':'xxx'})>0)
{
return service.getResp(field.req) //this is a service that calls a $http.post
.then((resp)=>{
field.resp=resp;
return field;
})
}
})
})
})
.then(finalResult=>{
submit(finalResult); //this is being called before the then above is completely done
})
})
function submit(finalResult){
.....
}
我通过以下更改解决了我的问题
.then(model=>{
return Promise.each(model.dataObj,data=>{
return getRequest(data.fields)
.then(()=>{
return service.getResp(field.req) //this is a service that calls a $http.post
.then((resp)=>{
field.resp=resp;
return field;
})
})
})
.then(finalResult=>{
submit(finalResult);
})
})
function getRequest(fields){
return mongooseModel.find({})
.then(result=>{
if(_findIndex(result, {'field.type':'xxx'})>0)
{
}
})
}
答案 0 :(得分:1)
至少部分问题出在此处:
.then(result=>{
return _.each(model.dataObj,data=>{
如果您希望下面的.then
等待其完成,您需要返回一个承诺。目前您返回_.each
的结果,这不是承诺(_.each
不是异步的),因此下一个.then
会立即继续。您最终会从service.getResp
返回看似承诺的内容,但是您将其返回到_.each
函数,该函数对它没有任何用处。
你应该做你的循环来找到你需要的field.req
,并在循环之外返回promise。类似的东西:
.then(result => {
let req;
// Loop and find what you need (maybe refactor this into a function)
// _.each ...
// _.each ...
// Outside of the loops return the promise
return service.getResp(req)
})