将异步功能与同步功能混合使用?

时间:2016-08-18 01:07:45

标签: javascript node.js asynchronous

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

2 个答案:

答案 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()