我是Node.js的新手,昨天开始学习它,我正在努力应对回调。我只是想从 getId
函数中返回值,并在favorite
函数中使用它
function getID(callback) {
var id;
T.get('statuses/user_timeline', {
screen_name: config.twitter_account,
count: 1
}, function(err, data, response) {
if (err) {
console.log("unable to get the id of last tweet")
} else {
for (i = 0; i < data.length; i++) {
//console.log(data)
console.log("this id of tweet: ", data[i].text, "is: ", data[i].id_str, );
id = data[i].id_str;
callback(id);
}
}
});
}
//-------------------------------------------------------------------
// favorite/like a tweet with id
//-------------------------------------------------------------------
function favorite() {
T.post('favorites/create', {
id: getID(function(id))
}, function(err, data, response) {
if (err) {
console.log("unable to favorite this tweet, you probably already favored it, TRY SOMETHING ELSE")
console.log(data);
} else {
console.log("The bot WORKED, WE FAVORED YOUR TWEET!")
}
})
};
答案 0 :(得分:0)
不确定T是什么,但这是我猜你正在尝试做的事情
function getID(callback){
var id;
T.get('statuses/user_timeline', { screen_name: config.twitter_account , count: 1} , function(err, data, response) {
if(err){
console.log("unable to get the id of last tweet")
}
else{
for(let i=0; i< data.length; i++){
//console.log(data)
console.log("this id of tweet: ", data[i].text, "is: ", data[i].id_str, );
id = data[i].id_str;
callback(id);
}
}
});
}
getID(function (id){T.post('favorites/create', {id: id} , function (err, data, response) {
if(err){
console.log("unable to favorite this tweet, you probably already favored it, TRY SOMETHING ELSE")
console.log(data);
}
else{
console.log("The bot WORKED, WE FAVORED YOUR TWEET!")
}
});});
答案 1 :(得分:0)
由于单线程事件循环的性质,几乎所有用Node.js编写的程序都是异步的。在JavaScript中,处理异步函数的传统方法是回调。回调是您希望在异步操作结束时执行的函数。这种类型的异步操作不会立即返回值(返回类型在其他语言中为void
)。您想要的数据将作为参数传递给回调函数。以下代码显示了使用回调的正确方法,以及如果您“正常”调用它会发生什么。
JavaScript中的回调可以是预先存在的,命名函数,也可以是匿名函数,如下例所示。在Node.js世界和大多数标准库中,这些回调具有function (err, result)
的特定形式。由于异步函数不能以相同的方式抛出错误,因此第一个参数用于指示出错的地方。如果您忘记检查错误参数,许多代码分析器会发出警告。
getId(function (err, id) {
if (err) {
// Something went wrong
} else {
// Everything is fine
console.log(id);
}
});
var id = getId(); // undefined
有点不清楚你要对getId
函数做什么。你在favorite
函数中使用它,就像它应该只返回一个ID,但你也在for循环中执行回调函数,这意味着它将为多个ID执行多次。其次,您将返回的ID作为第一个参数传递给回调。这实际上意味着确实出错了,ID描述了错误。最后,您尝试同步调用getId
。您的favorite
函数应首先执行getId
,然后在回调中使用结果。
function favorite() {
getId(function (err, id) {
if (err) {
// Could not get ID
} else {
T.post(‘favorites/create’, {id: id}, function (err, data, response) {
if (err) {
// Unable to favorite tweet
} else {
// Successfully favored tweet
}
});
}
});
}
正如您所看到的,回调的数量可以并且将很快嵌套在自身内部。为了清晰代码,您可以考虑将函数拆分为多个异步步骤。如果您的目的是获取ID列表并且最喜欢它们,那么您应该反转您的控制结构。也就是说,在favorite
请求的回调中调用T.get
。