包装没有回调的阻塞调用的优点?

时间:2017-01-19 13:41:05

标签: javascript node.js

标准

function myFunc() {
    const hash = crypto.createHash('sha1');
    hash.update(12345);
    return hash:
}

承诺承诺:

async function myFunc() {
   const hash = await new Promise((resolve, reject) => {
      try {
        resolve(crypto.createHash('sha1'));
      } catch (err) {
        reject(err);
      }
    });
    hash.update(12345); // <--- Blocking?
    return hash:
}

现在,通过阅读文档https://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm,它没有说明回调等等。所以,我假设它是一个阻塞调用。由于它是一个阻塞调用并且可能必须阻塞,包装它的优势是什么?因为它必须在某些时候阻止创建哈希,为什么我要包装它呢?

有一个https://github.com/valeriangalliat/crypto-promise模块包装它。

2 个答案:

答案 0 :(得分:0)

您在创建的.. }).then(function(listOfJobs) { var results = []; for (var i = 0; i < listOfJobs.length; i++) { results.push({ user: users[i], jobs: listOfJobs[i] }); } res.send(results); }).catch(function(error) { res.status(500).send('one of the queries failed', error); }); 上调用了更新功能并返回Promise。这没有任何意义,因为Promise不是update的函数。

Promise中,您只有两个功能,可以回馈您的结果。 Promiseresolve()

reject是一种处理回调的优雅方式。

新方式:

Promise

老方法,有回调:

const crypto = require('crypto');

/**
 * function returns a promise and you can pass the update value
 * update value must be a string or a buffer
 * @param updateValue
 * @returns {Promise}
 */
const myFunc = (updateValue) => {
  return new Promise((resolve, reject) => {
    try {
      resolve(crypto.createHash('sha1').update(updateValue.toString()));
    } catch (err) {
      reject(err);
    }
  });
};

// call function with your value
// then gives back the hash object
// catch gives back the error
myFunc(12345).then((hash) => {
  console.log(hash.digest('hex'));
}).catch(err => {
  console.log(err);
});

异步/ AWAIT

const crypto = require('crypto');

/**
 * update value must be a string or a buffer
 * two callback function. Success and error handling.
 * @param updateValue
 * @param callbackSuccess
 * @param callbackError
 */
var myFuncCallback = function(updateValue, callbackSuccess, callbackError) {
  try {
    callbackSuccess(crypto.createHash('sha1').update(updateValue.toString()));
  } catch (err) {
    callbackError(err);
  }
}

// call function with your value
myFuncCallback(12345, function(hash) {
  console.log(hash.digest('hex'));
}, function(err) {
  console.log(err);
});

答案 1 :(得分:0)

我认为将myFunc()按顺序与其他代码(阻止或非阻塞)一起使用会获益。

例如:

myFunc();
someFunc();

使用标准myFunc(),它会在someFunc()之前被阻止,直到myFunc()完成。

使用包裹的myFunc()someFunc()将在myFunc()被调用后立即执行。