将 promise 代码从 Q 转换为 bluebird

Convert promise code from Q to bluebird

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

  1. 是否有一种简单的方法(或工具)可以转换为 bluebird promises?
  2. 这个函数的bluebird版本怎么调用?
  3. 如何捕获异常?
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
    })
}
  1. 除了你的大脑和键盘,我不确定。
  2. 与任何其他函数一样:run()。 (注意:因为你在 run 中调用了 res.end,所以这样做并没有什么意义,但是你可以用 run().then(() => /* do something */ ) 链接另一个 promise。
  3. .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 */ })
}