Javascript 等待所有循环结果
我循环遍历一个数组并调用函数“getTopTracks”,它发出json请求(使用LastFM包装插件)。然后我将这些信息存储在一个新的数组“tracks_all”中 在使用“tracks\u all”数组之前,如何等待每个API调用的结果完成Javascript 等待所有循环结果,javascript,jquery,last.fm,Javascript,Jquery,Last.fm,我循环遍历一个数组并调用函数“getTopTracks”,它发出json请求(使用LastFM包装插件)。然后我将这些信息存储在一个新的数组“tracks_all”中 在使用“tracks\u all”数组之前,如何等待每个API调用的结果完成 //last.fm用户名数组 var user_list=['user1','user2','etc']; //获得顶级曲目 var getTopTracks=函数(用户,回调){ var last_fm; last_fm=新的LastFM({ apiK
//last.fm用户名数组
var user_list=['user1','user2','etc'];
//获得顶级曲目
var getTopTracks=函数(用户,回调){
var last_fm;
last_fm=新的LastFM({
apiKey://apiKey,
apiSecret://apiSecret
});
//last.fm api的方法
last_fm.user.getTopTracks({
用户:用户,,
句号:/句号,
限制轨道数
}, {
成功:功能(数据){
无功跟踪;
track_arr=data.toptracks.track;
回叫(跟踪arr);
},
错误:函数(代码、消息){}
});
};
var newFetch=函数(){
变量用户列表,
我
跟踪_all=[];
user\u list\u len=user\u list.length;
对于(i=0;i
由于您知道函数getTopTracks
将执行多少次,因此可以使用计数器跟踪还有多少次执行getTopTracks
在newFetch()
中:
var newFetch=函数(){
变量用户列表,
我
跟踪_all=[];
user\u list\u len=user\u list.length;
var cpt=user_list.length;//N左执行
对于(i=0;i调用最终回调函数
}
});
}
};
这是承诺
风格,使用时
// array of last.fm usernames
var user_list = ['user1', 'user2','etc'];
// get top tracks
var getTopTracks = function( user ){
var last_fm;
var deferred = when.defer();
last_fm = new LastFM({
apiKey : //apikey,
apiSecret : //apiSecret
});
// method of last.fm api
last_fm.user.getTopTracks({
user : user,
period : //period,
limit : //num of tracks
}, {
success: function( data ){
var track_arr;
track_arr = data.toptracks.track;
deferred.resolve(track_arr);
},
error: function( code, message ){
deferred.reject(code);
}
});
return deferred.promise();
};
var newFetch = function(){
var deferred = when.defer();
var promises = [];
user_list.forEach(function(user){
promises.push(getTopTracks(user));
});
when.all(promises, function(results){
// results will be an array of track_arr
deferred.resolve(results);
}, function(error){
deferred.reject(error);
});
return deferred.promise;
};
// What I want to do is something like...
var get_tracks = newFetch();
get_tracks.done(function(results){
// results will be an array of track_arr
}, function(error){
// handle error
});
这是使用async
// array of last.fm usernames
var user_list = ['user1', 'user2','etc'];
// get top tracks
var getTopTracks = function( user, callback ){
var last_fm;
var deferred = when.defer();
last_fm = new LastFM({
apiKey : //apikey,
apiSecret : //apiSecret
});
// method of last.fm api
last_fm.user.getTopTracks({
user : user,
period : //period,
limit : //num of tracks
}, {
success: function( data ){
var track_arr;
track_arr = data.toptracks.track;
callback(null, track_arr)
},
error: function( code, message ){
callback(code);
}
});
};
var newFetch = function(callback){
var functions = [];
user_list.forEach(function(user){
functions.push(getTopTracks(user));
});
async.parallel(functions, callback);
};
// What I want to do is something like...
newFetch(function(error, results){
// results will be an array of track_arr
});
更新语法您可以使用延迟,请参见此处,并在使用这些延迟时使用
:不确定如何将其连接到我的代码。有什么帮助吗?谢谢。当我尝试使用“When.defer()”时,它返回一个错误:Uncaught ReferenceError:When未定义您需要从这里手动包括When
library<代码>异步
可在此处找到
// array of last.fm usernames
var user_list = ['user1', 'user2','etc'];
// get top tracks
var getTopTracks = function( user ){
var last_fm;
var deferred = when.defer();
last_fm = new LastFM({
apiKey : //apikey,
apiSecret : //apiSecret
});
// method of last.fm api
last_fm.user.getTopTracks({
user : user,
period : //period,
limit : //num of tracks
}, {
success: function( data ){
var track_arr;
track_arr = data.toptracks.track;
deferred.resolve(track_arr);
},
error: function( code, message ){
deferred.reject(code);
}
});
return deferred.promise();
};
var newFetch = function(){
var deferred = when.defer();
var promises = [];
user_list.forEach(function(user){
promises.push(getTopTracks(user));
});
when.all(promises, function(results){
// results will be an array of track_arr
deferred.resolve(results);
}, function(error){
deferred.reject(error);
});
return deferred.promise;
};
// What I want to do is something like...
var get_tracks = newFetch();
get_tracks.done(function(results){
// results will be an array of track_arr
}, function(error){
// handle error
});
// array of last.fm usernames
var user_list = ['user1', 'user2','etc'];
// get top tracks
var getTopTracks = function( user, callback ){
var last_fm;
var deferred = when.defer();
last_fm = new LastFM({
apiKey : //apikey,
apiSecret : //apiSecret
});
// method of last.fm api
last_fm.user.getTopTracks({
user : user,
period : //period,
limit : //num of tracks
}, {
success: function( data ){
var track_arr;
track_arr = data.toptracks.track;
callback(null, track_arr)
},
error: function( code, message ){
callback(code);
}
});
};
var newFetch = function(callback){
var functions = [];
user_list.forEach(function(user){
functions.push(getTopTracks(user));
});
async.parallel(functions, callback);
};
// What I want to do is something like...
newFetch(function(error, results){
// results will be an array of track_arr
});