定义非阻塞验证函数nodeJS

时间:2017-03-17 13:39:13

标签: javascript node.js callback

我有两个功能:

function manipulateData(data,callback)

function isDataValid(data)

第一个应该操纵数据并且不返回任何内容,第二个应该根据数据的结构返回true,而不是完全操纵它。

假设有三件事:

- 操纵不需要有效数据。

- 数据的验证过程非常苛刻。

- 数据的验证过程应该接收原始数据。

如何使用验证函数作为回调参数,因此我可以在后台验证它,如果发现数据无效,只能从第一个函数抛出错误?

我希望它表现得像这样,第一个语句在后台运行,不会阻止数据操作。

function manipulateData(data, callback){ 
         if(callback(data)==false){ return some error }
         ...manipulate data without waiting for the verification...
}

我希望它确实可行,并且我没有错过回调机制中的关键逻辑部分。

1 个答案:

答案 0 :(得分:0)

您可以使用回调或承诺执行此操作。使用回调,你想使用像async这样的东西,但我绝对会使用Promises(或async / await)。

你说验证是I / O很重,所以我们假设这是一个异步函数。我假设操纵不是,但是一旦你使用Promise.all来封装它们并不重要。

以下是在节点6.10中测试的。它测试验证失败和成功,我非常确定我已经测试了每个函数在另一个函数之前完成测试,但无论如何Promise.all再次为你处理。

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

function manipulateData (data, zzz) {
  if (zzz) {
    sleep(zzz);
  }
  return 'manipulated data';
}

function isDataValid (data) {
  return new Promise((resolve, reject) => {
    if (data) {
      resolve('ok');
    } else {
      reject(new Error('nok'));
    }
  });
}

function updateData (data, zzz) {
  return Promise.all([
    isDataValid(data),
    manipulateData(data, zzz)
  ]);
}

function testIt (data, zzz) {
  return updateData(data, zzz)
  .then(([result, data]) => console.log(`Success! ${result} - ${data}`))
  .catch(err => console.log(`Fail! ${err}`));
}

testIt(true, 0)
.then(() => testIt(false, 0))
.then(() => testIt(true, 1000))
.then(() => testIt(false, 1000));

成功!好的 - 操纵数据

失败!错误:nok

成功!好的 - 操纵数据

失败!错误:nok