如何重构“;回调金字塔”;转换为基于承诺的版本
How to refactor a "callback pyramid" into promise-based version
我目前正在努力真正理解如何重构代码以使用promises/Q库。
考虑以下常见的基本示例:我有一个测试用例,它将同一个文件两次导入mongodb,然后检查第二次导入的数据集名称在末尾是否有修饰符。
importDataSet('myFile.csv',function () {
importDataSet('myFile.csv',function () {
DataSet.find({title: 1}, function (err, result) {
result.length.should.be.equal(2);
result[0].title.should.startWith('myFile');
result[1].title.should.startWith('myFile');
result[0].title.should.not.be.equal(result[0].title);
done();
});
});
});
done();
});
(done()是最后一次回调):
那么,我该如何使用承诺来做到这一点呢?最好在不更改函数签名的情况下,(我按照约定将回调作为最后一个参数)。
我不确定为什么done()
在您的代码中被调用两次,但如果没有这一点,它可能看起来类似于:
importDataSet('myFile.csv')
.then(function () {
return importDataSet('myFile.csv')
}).then(function () {
return DataSet.find({title: 1})
}).then(function (result) {
result.length.should.be.equal(2);
result[0].title.should.startWith('myFile');
result[1].title.should.startWith('myFile');
result[0].title.should.not.be.equal(result[0].title);
done();
});
相关文章:
- Node.js中依赖于版本的类型继承
- 我怎么能有一个自动渐变背景使用JavaScript,它适用于最新版本的Internet Explorer
- 如果用户的浏览器早于以下版本,则显示一条消息:IE 10、Firefox 39、Chrome 39、Opera 8
- 如何重构“;回调金字塔”;转换为基于承诺的版本
- javascript承诺和未来类似于C++
- Win8应用程序Html/Js正在获取版本号(相当于PackageVersion)
- 无法获得$q.所有工作都致力于多个承诺
- Jquery 切换/单击在早于 9 的 Safari 版本中不起作用
- 是量角器,以任何方式依赖于AngularJS版本
- JS:相当于async.each的承诺是什么
- 如何获取/设置当前页面URL(适用于时空浏览器版本)
- 如果我屈服于承诺,它会等待承诺得到解决后再继续吗
- 将客户端引导到正确的页面以下载适用于其操作系统版本的IE
- 在前端承诺中链接依赖于彼此的服务器调用是不好的做法吗?
- 在JavaScript中定义全局对象的独立于实现的版本
- 什么是ES6承诺相当于jQuery Deferred's 'always ' ?
- firebase web API版本2.X支持在写实时数据时返回set和update的承诺
- 是否有一种方法可以在承诺完成时独立于结果执行一些代码
- 函数应用于承诺
- 平展承诺链并执行特定于错误的catch语句