Javascript NodeJS在正确的时间获取变量的问题[npm-like模块]
我的nodejs代码有以下问题 我想做一个简单的计数器,在网页上显示facebook和twitter的喜好。我从npm找到了likes模块,它可以轻松完成这项工作,但我在获取它返回的值以稍后填充网页时遇到了问题 在本例中,我已恢复使用全局作用域来尝试修复我的问题 我有点了解异步调用的情况,但不知道如何解决它 我选择了NodeJS来做这个项目,这样我就可以更加熟悉这项技术。可以通过链接找到 期望的结果是,我最终得到两个变量,一个用于facebook,另一个用于twitter,我可以稍后使用它们来填充网页上的计数器 如果能给你一些建议,那就太好了。我明白这是一个非常重要/基本的问题,但我似乎不知道出了什么问题Javascript NodeJS在正确的时间获取变量的问题[npm-like模块],javascript,node.js,Javascript,Node.js,我的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
由节点提供,用于生成一个使用回调作为参数的函数