将承诺代码从Q转换为蓝鸟

时间:2015-07-26 19:35:02

标签: javascript promise bluebird

我正在尝试将此代码从Q转换为bluebird。

  1. 是否有简单的方法(或工具)转换为蓝鸟承诺?
  2. 如何调用此函数的bluebird版本?
  3. 我如何捕捉异常?
  4. 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
        })
    }
    

2 个答案:

答案 0 :(得分:1)

  1. 除了你的大脑和键盘,我不确定。
  2. 与任何其他功能一样:run()。 (注意:由于您在res.end中致电run,因此执行此操作并不合理,但您可以使用run().then(() => /* do something */ )链接另一个承诺。
  3. .catch(handleError).then(null, handleError)
  4. 这是使用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
    })
}