下面是代码:
var async = require('async');
var GitHubApi = require('github');
var github = new GitHubApi({
version: '3.0.0'
});
var getUserAvatarWithCallback = function(user, callback) {
github.search.users({ q: user }, function(err, res) {
if (err) { callback(err, null); }
else {
var avatarUrl = res.items[0].avatar_url;
callback(null, avatarUrl);
}
});
};
async.series([
function(callback1) {
for( var i = 0, length = 3; i < length; i++ ) {
getUserAvatarWithCallback('samucich', function(err,avatar) {
if (err) { console.log('Error: ',err) };
console.log('got url from Git',avatar);
});
}
callback1()
},
function(callbackAfterLoop) {
for( var i = 0, length = 10; i < length; i++ ) {
console.log('loop ',i);
}
callbackAfterLoop()
},
function() {
console.log('Done');
}
]);//async
输出:
loop 0
loop 1
loop 2
loop 3
loop 4
loop 5
loop 6
loop 7
loop 8
loop 9
Done
got url from Git https://avatars.githubusercontent.com/u/4983338?v=3
got url from Git https://avatars.githubusercontent.com/u/4983338?v=3
got url from Git https://avatars.githubusercontent.com/u/4983338?v=3
如果我理解正确的话,Node会将对Git api的调用放到它的事件堆栈上,然后在完成后调用我的程序。所以这就是为什么在输出中,我看到异步数组中第2和第3个函数的输出,在我看到第1个异步函数的输出之前... Git api调用需要更多时间...我得到了
我的问题是如何让它等待api调用Git完成并返回,然后转移到异步数组中的第二个函数?是async.series错误的approch?
非常感谢...... Sam
答案 0 :(得分:0)
好的,我测试了包和你的代码,希望现在有用了:
看起来async.series运行一系列中的每个函数,等待特定的回调,告诉它何时移动到下一个函数。
但是,如果在本系列中运行带有异步函数的循环,则需要让系列知道完成所有异步函数的时间。
添加一个条件,在遇到时触发回调。不幸的是,这似乎不是一种非常灵活的方法,因为您需要事先知道长度。
var count = 0;
async.series([
function(callback1) {
for(let i = 0; i < 3; i++) {
getUserAvatarWithCallback('samucich', function(err,avatar) {
if (err) { console.log('Error: ',err) };
console.log('got url from Git',avatar);
if (count === 2) {
callback1();
}
count++;
});
}
},
function(callbackAfterLoop) {
for( var i = 0, length = 10; i < length; i++ ) {
console.log('loop ',i);
}
callbackAfterLoop()
},
function() {
console.log('Done');
}
]);//async
从Git https://avatars.githubusercontent.com/u/4983338?v=3获取网址
从Git https://avatars.githubusercontent.com/u/4983338?v=3获取网址
从Git https://avatars.githubusercontent.com/u/4983338?v=3获取网址
循环0
...
循环9
完成
答案 1 :(得分:0)
尝试使用async.waterfall模块在第一次回调执行后实现,然后第二次执行。