我已经开始使用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个全局变量结束。所以我的问题是做这样的事情的正确方法是什么?
答案 0 :(得分: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)
}
我链接的最后一篇文章绝对值得一读,以便对异步挑战有一个很好的概述。这不是一个简单的概念,但一旦点击,它就非常直观。
答案 1 :(得分:0)
将.filter('startsWith', function() {
return function(array,search) {
if(!_.isUndefined(array) && !_.isUndefined(search)) {
var matches = [];
for (var i = 0; i < array.length; i++) {
if (array[i].Name.toUpperCase().indexOf(search.toUpperCase()) === 0 &&
search.length <= array[i].Name.length) {
matches.push(array[i]);
}
}
return matches;
}
};
});
传递到firstName
,然后将getLastName()
和firstName
传递到lastName
。以下是一些示例代码:
printName()