JavaScript Promise 不执行 .then()
JavaScript Promise not executing .then()
我在 JavaScript 中遇到 Promise 的一些问题。我想要做的是我得到一个地址列表,然后对于每个地址,我需要调用地理编码 API 来获取经纬度,然后我将继续绘制标记和热图。这是我的代码:
let promiseKey = Promise.all(
result.map()
);
var addedMarkers = promiseKey.then(
markers => Promise.all(
markers.map()
)
)
.then(drawForecastHeatmap);
我称之为地理编码的部分API:
function getBranchLatLng(address, branchName, total, queKey){
return new Promise(function(resolve){
var key = jQuery.rand(geoCodKeys);
var url = 'https://maps.googleapis.com/maps/api/geocode/json?key='+key+'&address='+address+'&sensor=false';
$.ajaxq (qyName, {
url: url,
dataType: 'json'
}).done(function( data ) {
var address = getParameterByName('address', this.url);
var index = errorArray.indexOf(address);
try{
var p = data.results[0].geometry.location;
var latlng = new google.maps.LatLng(p.lat, p.lng);
var markerItem =
{
'lat': p.lat,
'lng': p.lng,
'address': address,
'branchName': branchName,
'total': total,
};
console.log(markerItem);
resolve(markerItem);
if (index > -1) {
errorArray.splice(index, 1);
}
}catch(e){
if(data.status = 'ZERO_RESULTS')
return false;
//on error call add marker function for same address and keep in Error ajax queue
getBranchLatLng( address, 'Error' );
if (index == -1) {
errorArray.push( address );
}
}
});
//mentain ajax queue set
queuCounter++;
if( queuCounter == setLimit ){
queuCounter = 0;
}
});
}
现在的问题是,程序只是在 getBranchLatLng() 处停止,甚至从未进入 addForecastMarker(),尽管我设法从地理编码中打印出一些经纬度。
部分回我的地址:
jquery.min.js:4 GET https://maps.googleapis.com/maps/api/geocode/json?key=&address= 400 ()
然后当我尝试扩展 link 时,我得到了这个:
error_message: "Invalid request. Missing the 'address', 'bounds', 'components', 'latlng' or 'place_id' parameter."
results :[]
status: "INVALID_REQUEST"
关于如何将那些地址 'INVALID_REQUEST' 返回给 Promise 父级的任何想法?
谢谢!
如果没有您在代码中使用的所有测试数据和未声明的变量,就不可能生成工作代码。但总的来说,我可以建议的是,您必须向 ajax 请求添加一个 catch
块,并记住您的 getBranchLatLng Promise
中不能有不是 resolving
或 rejecting
诺言。
假设,万一出现任何错误,您仍然想解决您的 getBranchLatLng
,我已经像这样更新了您的代码,因此您的 getBranchLatLng
承诺中没有工作流' t resolve
或 reject
let promiseKey = Promise.all(
result.map(el=>getBranchLatLng(el.branchAddress, el.branchName, el.amount))
);
var addedMarkers = promiseKey.then(
markers => Promise.all(
markers.map(marker => addForecastMarker(marker))
)
)
.then(drawForecastHeatmap)
.catch(functon(e) {
//Do the error handling here
});
function getBranchLatLng(address, branchName, total, queKey) {
return new Promise(function(resolve, reject) {
var key = jQuery.rand(geoCodKeys);
var url = 'https://maps.googleapis.com/maps/api/geocode/json?key='+key+'&address='+address+'&sensor=false';
var qyName = '';
if( queKey ) {
qyName = queKey;
} else {
qyName = 'MyQueue'+queuCounter;
}
$.ajaxq (qyName, {
url: url,
dataType: 'json'
}).done(function( data ) {
var address = getParameterByName('address', this.url);
var index = errorArray.indexOf(address);
try{
var p = data.results[0].geometry.location;
var latlng = new google.maps.LatLng(p.lat, p.lng);
var markerItem =
{
'lat': p.lat,
'lng': p.lng,
'address': address,
'branchName': branchName,
'total': total,
};
console.log(markerItem);
if (index > -1) {
errorArray.splice(index, 1);
}
resolve(markerItem);
}catch(e) {
if (index == -1) {
errorArray.push( address );
}
resolve({type: 'error', status: data.status});
}
})
.catch(function(e) {
resolve({type: 'error', status: data.status});
//Instead of resolving with error code you can also reject the promise
//reject(e);
});
//mentain ajax queue set
queuCounter++;
if( queuCounter == setLimit ){
queuCounter = 0;
}
}
)};
function addForecastMarker(marker) {
console.log('adddddd markerssssss');
}
但这不是您可以用来直接获得最终结果的样板代码。当任何承诺失败时,您需要添加错误处理代码。为了您的帮助,我已经用 type: 'error'
兑现了这些承诺。在 promiseKey
的 then 块内,您必须阅读这些内容并进行进一步的错误处理,并在调用 addForecastMarker
之前从数组中删除它们。
希望对您有所帮助。
我在 JavaScript 中遇到 Promise 的一些问题。我想要做的是我得到一个地址列表,然后对于每个地址,我需要调用地理编码 API 来获取经纬度,然后我将继续绘制标记和热图。这是我的代码:
let promiseKey = Promise.all(
result.map()
);
var addedMarkers = promiseKey.then(
markers => Promise.all(
markers.map()
)
)
.then(drawForecastHeatmap);
我称之为地理编码的部分API:
function getBranchLatLng(address, branchName, total, queKey){
return new Promise(function(resolve){
var key = jQuery.rand(geoCodKeys);
var url = 'https://maps.googleapis.com/maps/api/geocode/json?key='+key+'&address='+address+'&sensor=false';
$.ajaxq (qyName, {
url: url,
dataType: 'json'
}).done(function( data ) {
var address = getParameterByName('address', this.url);
var index = errorArray.indexOf(address);
try{
var p = data.results[0].geometry.location;
var latlng = new google.maps.LatLng(p.lat, p.lng);
var markerItem =
{
'lat': p.lat,
'lng': p.lng,
'address': address,
'branchName': branchName,
'total': total,
};
console.log(markerItem);
resolve(markerItem);
if (index > -1) {
errorArray.splice(index, 1);
}
}catch(e){
if(data.status = 'ZERO_RESULTS')
return false;
//on error call add marker function for same address and keep in Error ajax queue
getBranchLatLng( address, 'Error' );
if (index == -1) {
errorArray.push( address );
}
}
});
//mentain ajax queue set
queuCounter++;
if( queuCounter == setLimit ){
queuCounter = 0;
}
});
}
现在的问题是,程序只是在 getBranchLatLng() 处停止,甚至从未进入 addForecastMarker(),尽管我设法从地理编码中打印出一些经纬度。
部分回我的地址:
jquery.min.js:4 GET https://maps.googleapis.com/maps/api/geocode/json?key=&address= 400 ()
然后当我尝试扩展 link 时,我得到了这个:
error_message: "Invalid request. Missing the 'address', 'bounds', 'components', 'latlng' or 'place_id' parameter."
results :[]
status: "INVALID_REQUEST"
关于如何将那些地址 'INVALID_REQUEST' 返回给 Promise 父级的任何想法?
谢谢!
如果没有您在代码中使用的所有测试数据和未声明的变量,就不可能生成工作代码。但总的来说,我可以建议的是,您必须向 ajax 请求添加一个 catch
块,并记住您的 getBranchLatLng Promise
中不能有不是 resolving
或 rejecting
诺言。
假设,万一出现任何错误,您仍然想解决您的 getBranchLatLng
,我已经像这样更新了您的代码,因此您的 getBranchLatLng
承诺中没有工作流' t resolve
或 reject
let promiseKey = Promise.all(
result.map(el=>getBranchLatLng(el.branchAddress, el.branchName, el.amount))
);
var addedMarkers = promiseKey.then(
markers => Promise.all(
markers.map(marker => addForecastMarker(marker))
)
)
.then(drawForecastHeatmap)
.catch(functon(e) {
//Do the error handling here
});
function getBranchLatLng(address, branchName, total, queKey) {
return new Promise(function(resolve, reject) {
var key = jQuery.rand(geoCodKeys);
var url = 'https://maps.googleapis.com/maps/api/geocode/json?key='+key+'&address='+address+'&sensor=false';
var qyName = '';
if( queKey ) {
qyName = queKey;
} else {
qyName = 'MyQueue'+queuCounter;
}
$.ajaxq (qyName, {
url: url,
dataType: 'json'
}).done(function( data ) {
var address = getParameterByName('address', this.url);
var index = errorArray.indexOf(address);
try{
var p = data.results[0].geometry.location;
var latlng = new google.maps.LatLng(p.lat, p.lng);
var markerItem =
{
'lat': p.lat,
'lng': p.lng,
'address': address,
'branchName': branchName,
'total': total,
};
console.log(markerItem);
if (index > -1) {
errorArray.splice(index, 1);
}
resolve(markerItem);
}catch(e) {
if (index == -1) {
errorArray.push( address );
}
resolve({type: 'error', status: data.status});
}
})
.catch(function(e) {
resolve({type: 'error', status: data.status});
//Instead of resolving with error code you can also reject the promise
//reject(e);
});
//mentain ajax queue set
queuCounter++;
if( queuCounter == setLimit ){
queuCounter = 0;
}
}
)};
function addForecastMarker(marker) {
console.log('adddddd markerssssss');
}
但这不是您可以用来直接获得最终结果的样板代码。当任何承诺失败时,您需要添加错误处理代码。为了您的帮助,我已经用 type: 'error'
兑现了这些承诺。在 promiseKey
的 then 块内,您必须阅读这些内容并进行进一步的错误处理,并在调用 addForecastMarker
之前从数组中删除它们。
希望对您有所帮助。