Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js中使用异步函数?_Javascript_Node.js_Asynchronous_Callback_Promise - Fatal编程技术网

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

Javascript 如何在Node.js中使用异步函数?,javascript,node.js,asynchronous,callback,promise,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_vali

我的职能:

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


我使用的是express框架。如何使用回调、承诺Q库或生成器膝关节炎框架来重构我的代码,以便与异步DNS查找函数进行良好的匹配?有人能用这三种方法修改我的代码吗?

回调与另一个问题相同

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

我会让其他人来展示发电机是怎么做的。我对它们不太熟悉。

请参见和。您不能从dnsCheck函数返回答案,因为dns.lookup是异步的,它会在dnsCheck完成并返回后返回。您当前的返回值只是被返回到网络处理代码的内部,而不会返回到任何地方。您可能希望将回调传递到dnsCheck,并在获得dns.lookup结果时调用该回调。这就是异步编程以及如何使用异步操作进行编程。是的。你所要求的是一项相当大的任务。我将在下面提供回电和承诺的答案。