Wait for All Loop Results Javascript
Wait for All Loop Results Javascript
我循环遍历一个数组并调用函数"getTopTracks",该函数会发出json请求(使用LastFM包装插件https://github.com/fxb/javascript-last.fm-api)。然后我将这些信息存储在一个新的数组"tracks_all"中。
在对"tracks_all"数组执行某些操作之前,如何等待每次API调用的结果完成?
// array of last.fm usernames
var user_list = ['user1', 'user2','etc'];
// get top tracks
var getTopTracks = function( user, callback ){
var last_fm;
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( track_arr );
},
error: function( code, message ){}
});
};
var newFetch = function(){
var user_list_len,
i,
tracks_all = [];
user_list_len = user_list.length;
for( i = 0; i < user_list_len; i++ ){
getTopTracks(
user_list[ i ],
function( data ){
var track_data = data;
// combine into one big array
tracks_all.push.apply( tracks_all, track_data );
});
}
};
// What I want to do is something like...
var get_tracks = newFetch();
// if the loop is done and all results are in
// call the function outputToDom()
这是使用when
的Promise
样式
// 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
的Callback
样式
// 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
});
更新语法
由于您知道函数getTopTracks
将被执行多少次,因此可以使用计数器来跟踪还有多少getTopTracks
的执行要执行。
在newFetch()
:中
var newFetch = function () {
var user_list_len,
i,
tracks_all = [];
user_list_len = user_list.length;
var cpt = user_list.length; // N executions left
for (i = 0; i < user_list_len; i++) {
getTopTracks(
user_list[i],
function (data) {
var track_data = data;
// combine into one big array
tracks_all.push.apply(tracks_all, track_data);
--cpt; // One execution has finished
if (cpt === 0) { // 0 execution left
outputToDom(); // -> Call the final callback
}
});
}
};
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Javascript:selenium Web驱动程序isDisplayed()不工作
- Wait for All Loop Results Javascript
- Javascript results in URL?
- 两个值之间的results数组-javascript
- javascript/jquery中.results函数和.result函数的区别
- Why does 2 && 3 results in 3 (javascript)?