Node.Js中CallBacks的问题

时间:2018-04-04 01:17:07

标签: javascript node.js bots

我是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!")
        }
    })
};

2 个答案:

答案 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