【发布时间】:2017-11-09 19:47:11
【问题描述】:
我是 Promise 的新手,无法解决这个语法问题。
在我的 .then 链中,我得到了这部分。我得到了一个数组数组,并想为数组内的一些对象添加一个新属性。在我这样做之前,我必须向googleDirection.directionRequest 提出请求,这解决了一个新的承诺。但是在将属性添加到对象时,对象是未定义的(我认为是因为 dbResult 在嵌套的 .then 链之外)。我尝试了不同的方法,但无法解决这个问题。
希望有人能帮我解决这个问题。
.then(function(dbResult){
for(var i = 0; i < dbResult.length; i++){
if(dbResult[i].length == 1){
var smallestValue = googleDirection.directionRequest(req.body.startlocation.latitude + "," + req.body.startlocation.longitude, dbResult[i][0].startLatitude + "," + dbResult[i][0].startLongitude,true,false)
.then(function(distance){
var values = [];
for(var j = 0; j < distance.routes.length; j++){
values.push(distance.routes[j].legs[0].distance.value);
}
return Math.min.apply(Math,values);
})
.then(function(value){
return(value);
})
smallestValue.then(function(value){
dbResult[i].tripStartToConstrStart = value;
})
}
}
return dbResult
})
.then(function(dbResult){
console.log(dbResult)
})
这是错误:
(node:8708) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot set property 'tripStartToConstrStart' of undefined
(node:8708) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot set property 'tripStartToConstrStart' of undefined
【问题讨论】:
-
如果要等待多个方向请求,需要
Promise.all。 -
您也可以使用
let i而不是var i,但是@Bergi 的评论当然是正确的(let i只会解决dbResult[i].tripStartToConstrStart = value错误,因为i将是用let定义时的当前索引) -
但问题不在于请求,问题在于我无法在嵌套的.then 中向
dbResult[i]添加新属性。dbresult[i]未定义。但在外观之外它工作正常 -
@WeSt 问题是您没有等待循环中的请求在检查结果之前添加结果
-
@WeSt 这个错误是因为
iis having the wrong value in the callback closures,正如 Icepickle 正确观察到的那样
标签: javascript node.js promise