标准
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,它没有说明回调等等。所以,我假设它是一个阻塞调用。由于它是一个阻塞调用并且可能必须阻塞,包装它的优势是什么?因为它必须在某些时候阻止创建哈希,为什么我要包装它呢?
答案 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
中,您只有两个功能,可以回馈您的结果。 Promise
和resolve()
。
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()
被调用后立即执行。