我正在尝试将此代码从Q转换为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
})
}
答案 0 :(得分:1)
run()
。 (注意:由于您在res.end
中致电run
,因此执行此操作并不合理,但您可以使用run().then(() => /* do something */ )
链接另一个承诺。.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 */ })
}
答案 1 :(得分:0)
我在使用promise构造函数Q.defer
简单地替换new Promise(...)
时没有看到任何问题,显然,bluebird api doc曾说过Promise.defer
但它已被弃用了以上。
我认为任何更改都不需要调用方法run
,因为它仍然会返回一个promise。此外,捕获异常将与拒绝处理程序或.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
})
}