我有一些要更新的旧Node.js代码。在此过程中,我正在设计新模块以与旧代码一起使用。我发现现在,与我最初写这篇文章时相反,我更多地依赖使用ES6 Promise,而不是回调。所以现在我混合了一些函数,这些函数返回Promise和一些采用回调-这很乏味。我认为最终应该重构使用诺言。但是在那之前…
在什么情况下首选promise和回调在哪里?
在某种情况下,回调能比承诺更好地处理吗,反之亦然?
根据到目前为止所见,我真的看不出有任何理由使用回调代替promise。真的吗?
首先,您几乎永远都不想编写混合了回调和对异步操作的承诺的代码。如果您要转向承诺或引入一些承诺,那么您可能希望将同一代码段中的回调重构为承诺。对于适当的操作类型,promise与普通回调相比有很多优点,因此当已经在代码区域中工作时,进行转换非常值得。
承诺非常适合:
pending
fulfilled
rejected
pending => fulfilled
pending => rejected
普通的回调对于promise不能做的事情有好处:
Array.prototype.map()
而且,我也将添加EventEmitter。
EventEmitter
EventEmitters适用于:
有关将纯回调代码转换为Promises的说明
如果您的回调调用适合与作为最后一个参数传递,并呼吁这样的回调约定的节点callback(err, result),那么你有点自动换行父功能的承诺与util.promisify()在node.js中,或者使用蓝鸟承诺库,用Promise.promisify()。
callback(err, result)
util.promisify()
Promise.promisify()
使用Bluebird,您甚至可以一次分配一个完整的模块(在node.js调用约定中使用异步回调),例如:
const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs')); fs.writeFileAsync("file.txt", data).then(() => { // done here }).catch(err => { // error here });
在node.js版本8+中
现在有util.promisify()一个将使用node.js异步调用约定的异步函数转换为返回promise的函数。
doc中的示例:
const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); // usage of promisified function stat('.').then((stats) => { // Do something with `stats` }).catch((error) => { // Handle the error. });