将 promise 代码从 Q 转换为 bluebird
Convert promise code from Q to bluebird
我正在尝试将此代码从 Q 转换为 bluebird。
- 是否有一种简单的方法(或工具)可以转换为 bluebird promises?
- 这个函数的bluebird版本怎么调用?
- 如何捕获异常?
function run (req, res, filePath) {
var d = Q.defer();
var writeStream = fs.createWriteStream(filePath, { flags: 'w' });
req.pipe(writeStream);
req.on("end", function () {
console.log("Finish to update data file");
d.resolve();
});
req.on("error", function (err) {
d.reject(err);
});
return d.promise.then(function () {
res.end("File " + filePath + " saved successfully");
}).catch(function (err) {
//handle error
})
}
我没有看到简单地用 promise constructor new Promise(...)
替换 Q.defer
有任何问题,显然,bluebird api doc 说曾经有 Promise.defer
但它已被弃用赞成上述观点。
我认为调用方法 run
不需要任何更改,因为它仍然是 returns 一个承诺。此外,捕获异常与之前的拒绝处理程序或 .catch
:
相同
var Promise = require("bluebird");
...
run: function (req, res, filePath) {
var promise = new Promise(function(resolve, reject){
var writeStream = fs.createWriteStream(fileRelPath, {flags: 'w'});
req.pipe(writeStream);
req.on("end", function () {
console.log("Finish to update data file");
resolve();
});
req.on("error", function (err) {
reject(err);
});
});
return promise.then(function(){
res.end("File " + filePath + " saved successfully");
}).catch(function(err){
//handle error
})
}
- 除了你的大脑和键盘,我不确定。
- 与任何其他函数一样:
run()
。 (注意:因为你在 run
中调用了 res.end
,所以这样做并没有什么意义,但是你可以用 run().then(() => /* do something */ )
链接另一个 promise。
.catch(handleError)
或 .then(null, handleError)
.
这是一个使用 ES6 的解决方案(但它应该很容易适应 ES5 环境):
import Promise from 'bluebird'
function run (req, res, filePath) {
return new Promise((resolve, reject) => {
req.pipe(fs.createWriteStream(filePath, { flags: 'w' }))
req.on('end', resolve)
req.on('error', reject)
})
.then(() => res.end(`File ${ filePath } saved successfully`))
.catch((err) => { /* do something */ })
}
我正在尝试将此代码从 Q 转换为 bluebird。
- 是否有一种简单的方法(或工具)可以转换为 bluebird promises?
- 这个函数的bluebird版本怎么调用?
- 如何捕获异常?
function run (req, res, filePath) {
var d = Q.defer();
var writeStream = fs.createWriteStream(filePath, { flags: 'w' });
req.pipe(writeStream);
req.on("end", function () {
console.log("Finish to update data file");
d.resolve();
});
req.on("error", function (err) {
d.reject(err);
});
return d.promise.then(function () {
res.end("File " + filePath + " saved successfully");
}).catch(function (err) {
//handle error
})
}
我没有看到简单地用 promise constructor new Promise(...)
替换 Q.defer
有任何问题,显然,bluebird api doc 说曾经有 Promise.defer
但它已被弃用赞成上述观点。
我认为调用方法 run
不需要任何更改,因为它仍然是 returns 一个承诺。此外,捕获异常与之前的拒绝处理程序或 .catch
:
var Promise = require("bluebird");
...
run: function (req, res, filePath) {
var promise = new Promise(function(resolve, reject){
var writeStream = fs.createWriteStream(fileRelPath, {flags: 'w'});
req.pipe(writeStream);
req.on("end", function () {
console.log("Finish to update data file");
resolve();
});
req.on("error", function (err) {
reject(err);
});
});
return promise.then(function(){
res.end("File " + filePath + " saved successfully");
}).catch(function(err){
//handle error
})
}
- 除了你的大脑和键盘,我不确定。
- 与任何其他函数一样:
run()
。 (注意:因为你在run
中调用了res.end
,所以这样做并没有什么意义,但是你可以用run().then(() => /* do something */ )
链接另一个 promise。 .catch(handleError)
或.then(null, handleError)
.
这是一个使用 ES6 的解决方案(但它应该很容易适应 ES5 环境):
import Promise from 'bluebird'
function run (req, res, filePath) {
return new Promise((resolve, reject) => {
req.pipe(fs.createWriteStream(filePath, { flags: 'w' }))
req.on('end', resolve)
req.on('error', reject)
})
.then(() => res.end(`File ${ filePath } saved successfully`))
.catch((err) => { /* do something */ })
}