如何在Node.js中使用异步函数?

时间:2014-05-04 22:35:59

标签: javascript node.js asynchronous callback promise

我的功能:

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函数只是一个正则表达式检查器,如果传递的则返回false,则返回true。

我正在使用快递框架。如何使用回调,promises(Q库)或生成器(koa框架)重构我的代码,以便与async" dns.lookup"完美匹配。功能? 有人可以使用这三种方法修改我的代码吗?

1 个答案:

答案 0 :(得分:0)

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

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

我会留下其他人来展示它是如何用发电机完成的。我对他们并不像我所承诺的那样熟悉。