Javascript NodeJS在正确的时间获取变量的问题[npm-like模块]

Javascript NodeJS在正确的时间获取变量的问题[npm-like模块],javascript,node.js,Javascript,Node.js,我的nodejs代码有以下问题 我想做一个简单的计数器,在网页上显示facebook和twitter的喜好。我从npm找到了likes模块,它可以轻松完成这项工作,但我在获取它返回的值以稍后填充网页时遇到了问题 在本例中,我已恢复使用全局作用域来尝试修复我的问题 我有点了解异步调用的情况,但不知道如何解决它 我选择了NodeJS来做这个项目,这样我就可以更加熟悉这项技术。可以通过链接找到 期望的结果是,我最终得到两个变量,一个用于facebook,另一个用于twitter,我可以稍后使用它们来填

我的nodejs代码有以下问题

我想做一个简单的计数器,在网页上显示facebook和twitter的喜好。我从npm找到了likes模块,它可以轻松完成这项工作,但我在获取它返回的值以稍后填充网页时遇到了问题

在本例中,我已恢复使用全局作用域来尝试修复我的问题

我有点了解异步调用的情况,但不知道如何解决它

我选择了NodeJS来做这个项目,这样我就可以更加熟悉这项技术。可以通过链接找到

期望的结果是,我最终得到两个变量,一个用于facebook,另一个用于twitter,我可以稍后使用它们来填充网页上的计数器

如果能给你一些建议,那就太好了。我明白这是一个非常重要/基本的问题,但我似乎不知道出了什么问题

var likes=require('likes'))
global.twitterFollowers=0
global.facebook=0
函数getLikes()
{
likes.facebook('me',函数(err,count)
{
如果(错误)
{
控制台错误(err)
进程。退出(1)
}
global.facebook=count
log(“FACEBOOK:,global.facebookLikes”)
})
likes.twitter('me',函数(err,count)
{
如果(错误)
{
控制台错误(err)
进程。退出(1)
}
global.twitterFollowers=计数
log(“TWITTER:,global.TWITTER追随者)
})
}
getLikes()
console.log('I have',global.Facebook likes,'likes on Facebook!')

log('I have',global.Twitter followers,'followers on Twitter!')
Javascript是使用事件循环的异步语言。在代码中,这些行是在函数
getLikes()
完成之前执行的

console.log('I have ' , global.facebookLikes , ' likes on Facebook!')
console.log('I have ' , global.twitterFollowers , ' followers on Twitter!')
您只需使用Async/Await语法,就可以在
Await getLikes()
call上进行等待。 虽然您的全局变量在控制台日志之后设置了值,但您可以稍后使用这些值。但如果不使用回调、承诺或异步/等待,您将不知道何时
getLikes()
完成执行。我建议您观看一些关于回调、承诺和异步/等待的教程。它将帮助你在JS世界中生存和战斗


希望有帮助。

Javascript是使用事件循环的异步语言。在代码中,这些行是在函数
getLikes()
完成之前执行的

console.log('I have ' , global.facebookLikes , ' likes on Facebook!')
console.log('I have ' , global.twitterFollowers , ' followers on Twitter!')
您只需使用Async/Await语法,就可以在
Await getLikes()
call上进行等待。 虽然您的全局变量在控制台日志之后设置了值,但您可以稍后使用这些值。但如果不使用回调、承诺或异步/等待,您将不知道何时
getLikes()
完成执行。我建议您观看一些关于回调、承诺和异步/等待的教程。它将帮助你在JS世界中生存和战斗


希望有帮助。

您的代码是异步工作的,我建议您推荐基于回调的方法,并使用async/await使其作为同步代码工作。 例如,请参见下面的代码。别忘了先安装蓝鸟软件包

另外,我建议您去掉全局变量,只需从getLikes函数返回它们

const likes = require('likes')
const Promise = require('bluebird');

async function getLikes() {
    try {
        const facebookLikesPromise = Promise.promisify(likes.facebook)('me');
        const twitterFollowersPromise = Promise.promisify(likes.twitter)('me');
        const [facebookLikes, twitterFollowers] = await Promise.all([facebookLikesPromise, twitterFollowersPromise]);
        console.log("FACEBOOK: ", facebookLikes)
        console.log("TWITTER: ", twitterFollowers)
    } catch (error) {
        console.error(error);
        process.exit(1);
    }

    return { facebookLikes, twitterFollowers };
}

getLikes()
    .then(({ facebookLikes, twitterFollowers }) => {
        console.log('I have ', facebookLikes, ' likes on Facebook!')
        console.log('I have ', twitterFollowers, ' followers on Twitter!')
    })

注:如果您使用Node 8.0.0+,那么您可以使用util.promisify而不是bluebird promisify您的代码是异步工作的,我建议您使用基于回调的方法,并使用async/await使其作为同步代码工作。 例如,请参见下面的代码。别忘了先安装蓝鸟软件包

另外,我建议您去掉全局变量,只需从getLikes函数返回它们

const likes = require('likes')
const Promise = require('bluebird');

async function getLikes() {
    try {
        const facebookLikesPromise = Promise.promisify(likes.facebook)('me');
        const twitterFollowersPromise = Promise.promisify(likes.twitter)('me');
        const [facebookLikes, twitterFollowers] = await Promise.all([facebookLikesPromise, twitterFollowersPromise]);
        console.log("FACEBOOK: ", facebookLikes)
        console.log("TWITTER: ", twitterFollowers)
    } catch (error) {
        console.error(error);
        process.exit(1);
    }

    return { facebookLikes, twitterFollowers };
}

getLikes()
    .then(({ facebookLikes, twitterFollowers }) => {
        console.log('I have ', facebookLikes, ' likes on Facebook!')
        console.log('I have ', twitterFollowers, ' followers on Twitter!')
    })

注:如果您使用Node 8.0.0+,那么您可以使用util.promisify而不是bluebird promisify

您应该使用Promises,这将使事情更具可读性

举个例子,我将通过以下功能模拟facebook和twitter的请求:

function getFacebooksExample(callback) {
  setTimeout(() => {
    callback(null, 242);
  }, 2000)
}

function getTwitterExample(callback) {
  setTimeout(() => {
    callback(null, 1887);
  }, 3000)
}
基本上,每个函数的回调都与
likes
模块相同,因此您可以使用
util.promisify
<节点提供code>util.promisify,目的是使使用回调作为参数的函数返回承诺

本例中,Facebook的“请求”需要2秒,Twitter的请求需要3秒

现在,您可以使用
Promise.all()
并发运行所有承诺,并在它们全部解决后返回,这样您就不必等到第一个承诺结束后再开始第二个承诺

const util = require('util');

async function getikes() {
  return await Promise.all([
    util.promisify(getFacebooksExample)(),
    util.promisify(getTwitterExample)()
  ])
}

function getFacebooksExample(callback) {
  setTimeout(() => {
    callback(null, 242);
  }, 2000)
}

function getTwitterExample(callback) {
  setTimeout(() => {
    callback(null, 1887);
  }, 3000)
}

getikes().then(console.log)
编辑:如果您不能使用
util.promisify
,您仍然可以返回如下承诺:

异步函数getikes(){ 回报等待承诺([ getFacebooksExample(), getTwitterExample() ]) } 函数getFacebooksExample(回调){ 返回新承诺((解决)=>{ 设置超时(()=>{ 决心(242); }, 2000) }) } 函数getTwitterExample(回调){ 返回新承诺((解决)=>{ 设置超时(()=>{ 决心(1887年); }, 3000) }) }
getikes()。然后(console.log)您应该使用承诺,它将使事情更具可读性

举个例子,我将通过以下功能模拟facebook和twitter的请求:

function getFacebooksExample(callback) {
  setTimeout(() => {
    callback(null, 242);
  }, 2000)
}

function getTwitterExample(callback) {
  setTimeout(() => {
    callback(null, 1887);
  }, 3000)
}
基本上,每个函数的回调都与
likes
模块相同,因此您可以使用
util.promisify
util.promisify
由节点提供,用于生成一个使用回调作为参数的函数