【问题标题】:How do I play with async functions in Node.js? [duplicate]如何在 Node.js 中使用异步函数? [复制]
【发布时间】:2014-06-21 03:46:28
【问题描述】:

我的功能:

function dnsCheck(domain,tld) {
var dns = require('dns')
    dns.lookup(domain+'.'+tld, function (err, addresses) {
    if (err) return false // means domain avl
        else return true // means domain not avl
    })
}

我的条件语句:

if(domain_validator(domain,tld) && !dnsCheck(domain,tld)) {
res.end("avl")
}
else {
res.end("not avl")
}

domain_validator 函数只是一个正则表达式检查器,如果通过则返回 true,否则返回 false。

我正在使用 express 框架。如何使用回调、承诺(Q 库)或生成器(koa 框架)重构我的代码,以便与异步“dns.lookup”函数很好地配合? 谁能使用这三种方法修改我的代码

【问题讨论】:

  • 您无法从dnsCheck() 函数返回答案,因为dns.lookup() 是异步的,它会在dnsCheck() 已经完成并返回之后的某个时间返回。您当前的返回值只是被返回到网络处理代码的深处并且无处可去。您可能希望将回调传递给dnsCheck(),并在获得dns.lookup() 结果时调用该回调。这就是异步编程以及你必须如何使用异步操作来完成它。
  • 是的。您要问的是一项艰巨的任务。我将在下面提供回调(可能还有承诺)的答案。

标签: javascript node.js asynchronous callback promise


【解决方案1】:

回调(与其他问题相同)。

var dnsCheck = function(domain, tld, callback) {
  require('dns').lookup(domain + '.' + tld, function (err, addresses) {
    return callback(err == null);
  });
};

// Let's assume domainValidate is async too
var domainValidate = function(domain, tld, callback) {
  return callback(true);  // Add your logic here
};

dnsCheck(domain, tld, function(isChecked) {
  domainValidate(domain, tld, function(isValid) {

    if (isChecked && isValid) {
      res.end('available');
    } else {
      res.end('unavailable');
    }
  });
});

承诺(我不知道 Q,但我希望你明白)。

var dnsCheck = function(domain, tld) {
  return new Promise(function(resolve, reject) {
    require('dns').lookup(domain + '.' + tld, function (err, addresses) {
      if (err) return reject();
      resolve();
    });
  });      
};    

// Domain validate will be similar  

dnsCheck(domain, tld).then(function() {
  return domainValidate(domain, tld);
})
.then(function() {
  res.end('available');
})
.catch(function() {
  res.end('unavailable');
});

我会留下其他人来展示它是如何使用生成器完成的。我不像我承诺的那样熟悉它们。

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多