【发布时间】:2017-06-17 16:36:15
【问题描述】:
我试图在所有 ajax 调用完成后调用一次函数。下面的 $.when 被空的 promise 数组调用得太快了。 searchRecommendations() 在之前的几次$.ajax 调用的成功中被调用了几次。这能以某种方式负责吗?
var MAX = 2; //Maximum levels queried
var ARTISTS = []; //Multidimensional array with the number of potential 'artists' i.e. compare Madonna, to Beethoven to Eminem to nth-artist
var RELEVENT_ARTISTS = 2; //Number of relevent artists added to the list for each new artist
var promises = [];
$(function(){
init(0);
})
function init(i){
for(var i; i<1; i++){
console.log('searchArtists for relevant artist '+$('input')[i].value)
var artist = $('input')[i].value;
$.ajax({
url: 'https://api.spotify.com/v1/search',
data: {
q: artist,
type: 'artist'
},
success: function (response) {
console.log(response.artists.href);
searchRecommendations(response.artists.items[0].id, 0)
//nextLevel(0)
}
});
}
//console.log(ARTISTS)
//getMatches(ARTISTS)
}
function searchRecommendations(artist, depth) {
console.log(' ')
console.log('searchRecommendations '+artist+ ' '+ depth )
if(depth == MAX){ return console.log('max reached '+depth) } else {
promises.push(
$.ajax({
url: 'https://api.spotify.com/v1/artists/' + artist + '/related-artists',
data: {
type: 'artist',
},
success: function (response) {
console.log('RESPONSE');
console.log(response)
for(var r=0; r<RELEVENT_ARTISTS; r++){
console.log(response.artists[r].name)
var obj = { 'artist' : response.artists[r].name, 'level':(depth+1)*5 }
ARTISTS.push(obj)
searchRecommendations(response.artists[r].id, depth+1) //Recursion
}
}
})
)
}
}
$.when.apply(undefined, promises).done(function() {
convert_artists_to_nodes_and_links(ARTISTS)
console.log( 'this is being called too soon')
console.log( promises )
})
【问题讨论】:
-
searchRecommendations在哪里调用?MAX和ARTISTS在哪里定义?你为什么尝试从searchRecommendationsreturnsetTimeout? -
你可以试试
.ajaxStop()它会等待所有的Ajax调用完成。这是文档:api.jquery.com/ajaxStop -
您拥有的代码将在一个空的
promises数组中等待...如果稍后通过某种方式调用该函数,$.when不会神奇地“重新运行”...承诺不能替代事件驱动代码 -
@guest271314 即使没有 setTimeout 我也有这个问题。
-
OK ... 那么为什么你认为
$.when会等待init完成后再执行呢? ...您的代码就像让var promises = [];立即 跟在$.when...之后,然后是您的函数定义...正如我之前所说,$.when不检查以查看承诺何时有数据在里面......它怎么知道什么时候都被添加了?
标签: javascript jquery ajax promise .when