gpt4 book ai didi

javascript - 将异步函数与同步函数混合?

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:00 32 4
gpt4 key购买 nike

我已经开始使用 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 个全局变量结束。所以我的问题是做这样的事情的正确方法是什么?

最佳答案

@jfriend00 在他/她的评论中指的是,当您定义函数时,您可以定义该函数应采用的参数

考虑到这一点,您可以将代码重写为如下所示:

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);
}

请注意,该过程的每个“步骤”都接受前一个“步骤”的结果。

您使用的异步技术被亲切地称为回调 hell ,因为回调(即您所使用的函数)传递给 .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)
}

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

关于javascript - 将异步函数与同步函数混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39008458/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com