什么@ 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)
}
我链接的最后一篇文章绝对值得一读,以便对异步挑战有一个很好的概述。这不是一个简单的概念,但一旦点击,它就非常直观。
应该有零全局变量。你知道将参数传递给函数吗?这就是你如何将信息从一个上下文传递到另一个函数而不使用全局变量。这是一个非常基本的编程概念,所以它可能对您遵循一些关于编程基础知识的在线教程非常有帮助,而不仅仅是在没有经过适当培训的情况下编写代码。 – jfriend00
在promises上教育自己,这是使用异步函数的正确方法,就像它们是同步的。检查f.i.这个关于承诺点的链接:https://gist.github.com/domenic/3889970。在异步函数的回调中混淆调用异步函数会导致回调地狱,并且它不是制作通用,可测试和可重用代码的可靠方法。编辑:实际上@Brandon答案得到的点 – Sergeon
我知道应该有零全局变量我知道关于传递函数的参数。问题是我有很多函数会得到一个变量,需要转到函数的第五个函数,必须有一个更好的方法,而不是将这个变量传递给4个函数,永远不会使用它。 – Ashlin