2016-08-18 61 views
0

我已经开始玩Node.js了,但是我在异步功能方面遇到了问题,我可以制作一款游戏小游戏。但我能够使异步函数与同步函数一起工作的唯一方法是使用全局变量。将异步函数与同步函数混合?

var promptly = require("./promptly"); //needed for input {npm install promptly} 
var firstName; 
var lastName; 

GetFirstName(); 

function GetFirstName() { //asynchronous function 
    promptly.prompt('You first name: ', function (err,value) { 
     firstName = value; 
     getLastName(); 
    }); 
} 

function getLastName() { //asynchronous function 
    promptly.prompt('You last name: ', function (err,value) { 
     lastName = value; 
     printName(); 
    }); 
} 

function printName() { //synchronous function 
    console.log(firstName+" "+lastName); 
} 

这工作,但我有5异步功能的小游戏与全球14个变量结束。所以我的问题是做这样的事情的正确方法是什么?

+3

应该有零全局变量。你知道将参数传递给函数吗?这就是你如何将信息从一个上下文传递到另一个函数而不使用全局变量。这是一个非常基本的编程概念,所以它可能对您遵循一些关于编程基础知识的在线教程非常有帮助,而不仅仅是在没有经过适当培训的情况下编写代码。 – jfriend00

+1

在promises上教育自己,这是使用异步函数的正确方法,就像它们是同步的。检查f.i.这个关于承诺点的链接:https://gist.github.com/domenic/3889970。在异步函数的回调中混淆调用异步函数会导致回调地狱,并且它不是制作通用,可测试和可重用代码的可靠方法。编辑:实际上@Brandon答案得到的点 – Sergeon

+0

我知道应该有零全局变量我知道关于传递函数的参数。问题是我有很多函数会得到一个变量,需要转到函数的第五个函数,必须有一个更好的方法,而不是将这个变量传递给4个函数,永远不会使用它。 – Ashlin

回答

1

什么@ jfriend00指的是在他/她的评论是,当你定义一个函数,你可以定义parameters该功能应该采取。记住

有了这一点,你可以重写你的代码是这样的:

var promptly = require("./promptly"); //needed for input {npm install promptly} 


GetFirstName(); 

function GetFirstName() { //asynchronous function 
    promptly.prompt('You first name: ', function (err,firstName) { 

     getLastName(firstName); 
    }); 
} 

function getLastName(firstName) { //asynchronous function 
    promptly.prompt('You last name: ', function (err,lastName) { 

     printName(firstName, lastName); 
    }); 
} 

function printName(firstName, lastName) { //synchronous function 
    console.log(firstName+" "+lastName); 
} 

注意,每个进程的“一步”接受来自之前的“一步”的结果。

你使用被亲切地称为callback hell异步技术,为callback S(即functions你传递给.prompt()作为第二个参数)往往巢深深&很快变得难以管理。

JavaScript这几天有很多解决方案来解决这个问题。一旦你了解了异步程序的“流程”,我建议寻找一些更加用户友好的选项(以我们的盐片为例,它们只是为了说明概念):

async.js - 这个图书馆有很多很好的工具可以帮助你写的回调更可读的方式:

async.series([ 
    asyncFunction1(arg, callback) { 
    // code 
    callback() 
    }, 
    asyncFunction2(arg, callback) { 
    // code 
    callback() 
    }, 
    asyncFunction3(arg, callback) { 
    // code 
    callback() 
    } 
] 

Promises - 在Javascript中的新功能和一个图书馆已经支持。引擎盖下这些都是有趣的,但实际上他们只是允许更清晰的代码和错误处理:

asyncFunction1(args) { 
    // code 
    return x 
} 
.then(asyncFunction2(x) { 
    // code 
    return y 
}) 
.then(asyncFunction3(y) { 
    // code 
    return z 
}) 

async/await - 最新尝试之一是解决异步代码的挑战。我个人还没有使用过它们,但是这些例子很有趣。

async function getName() { 
    let firstName = await getFirstName() 
    let lastName = await getLastName() 
    console.log("Your name is " + firstName + lastName) 
} 

我链接的最后一篇文章绝对值得一读,以便对异步挑战有一个很好的概述。这不是一个简单的概念,但一旦点击,它就非常直观。

+0

FWIW这不是回调地狱。这是回调地狱的解决方案:分别定义函数而不是嵌套。 – slebetman

0

通行证firstNamegetLastName()再通firstNamelastNameprintName()。下面是一些示例代码:

var promptly = require("promptly"); 
GetFirstName(); 

function GetFirstName() { 
    promptly.prompt('You first name: ', function (err,value) { 
    getLastName(value); 
    }); 
} 

function getLastName(firstName) { 
    promptly.prompt('You last name: ', function (err,value) { 
    printName(firstName, value); 
    }); 
} 

function printName(firstName, lastName) { 
    console.log(firstName + " " + lastName); 
}