我正在尝试在每个循环的Jquery中对API进行外部AJAX调用。
这是我到目前为止的代码。
getStylesInfo(tmpMake, tmpModel, tmpModelYear, tmpSubmodel).done(function(data){
var holder = [];
$.each(styles, function(index, value) {
var tempValue = value;
var temp = getNavigationInfo(value.id);
$.when(temp).done(function(){
if(arguments[0].equipmentCount == 1){
holder.push(tempValue);
console.log(holder);
}
});
});
});
console.log(holder);
function getStylesInfo(make, model, year, submodel){
return $.ajax({
type: "GET",
url: apiUrlBase + make + '/' + model + '/' + year + '/' + 'styles? fmt=json&' + 'submodel=' + submodel + '&api_key=' + edmundsApiKey + '&view=full',
dataType: "jsonp"
});
function getNavigationInfo(styleId){
return $.ajax({
type: "GET",
url: apiUrlBase + 'styles/' + styleId + '/equipment?availability=standard&name=NAVIGATION_SYSTEM&fmt=json&api_key=' + edmundsApiKey,
dataType: "jsonp"
});
getStylesInfo()返回与此类似的内容。一系列带有汽车模型信息的对象。
var sampleReturnedData = [{'drivenWheels': 'front wheel drive', 'id': 234321}, {'drivenWheels': 'front wheel drive', 'id': 994301}, {'drivenWheels': 'rear wheel drive', 'id': 032021}, {'drivenWheels': 'all wheel drive', 'id': 184555}];
我试图遍历sampleReturnedData,并使用getNavigationInfo()函数将每个id用作不同AJAX调用中的参数。
我想遍历结果并进行检查。如果为真,那么我想将整个对象推送到holder数组。
问题是函数外的console.log(holder)返回一个空数组。 if语句中的console.log(holder)正常工作。
我不确定这是示波器/吊装问题还是我使用延期方式的问题?
我读过this问题,很多人都喜欢。他们建议使用
async:false
或者更好地重写代码。我已经尝试并多次使用控制台调试器。我不想将其设置为false。我只是不确定到底发生了什么。
我还通过this文章阅读了有关提升的信息。
我认为这与延迟有关,但是我对JS的了解不足。
谢谢!
最佳答案
我不确定这是示波器/吊装问题还是我使用延期方式的问题?
实际上,两者都是:holder
仅在回调函数内声明(作为局部变量),因此在函数外的undefined
中声明。
并且console.log
是在异步回调函数确实用值填充数组之前执行的,因此,即使holder
在范围内,它仍将为空。另见Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference
因此,您实际上应该重写您的代码以正确使用Promise :-)
getStylesInfo(tmpMake, tmpModel, tmpModelYear, tmpSubmodel).then(function(data) {
var holder = [];
var promises = $.map(data.styles, function(value, index) {
return getNavigationInfo(value.id).then(function(v){
if (v.equipmentCount == 1)
holder.push(value);
});
});
return $.when.apply($, promises).then(function() {
return holder;
}); // a promise for the `holder` array when all navigation requests are done
}).then(function(holder) {
console.log(holder); // use the array here, in an async callback
});
关于javascript - JavaScript范围/吊起或 promise /延期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29834259/