记录时避免使用Promise构造函数反模式

时间:2016-03-11 16:43:34

标签: javascript promise bluebird

我正在看这个问题,答案是有道理的

What is the explicit promise construction antipattern and how do I avoid it?

但是,如果你只想简单地在函数中添加一条日志消息,或者简单的东西是否有任何方法可以避免像这样创建一个新的承诺

function getStuffDone(param) {
    return new Promise(function(resolve, reject) {
        // using a promise constructor
        myPromiseFn(param+1)
        .then(function(val) {
            console.log("getStuffDone executing");
            resolve(val);
        }).catch(function(err) {
            console.log("getStuffDone error");
            reject(err);
        });
    });
}

如果你想在这个位置运行promise之前还想要一条日志消息怎么办?这会让事情变得更加困难吗?

function getStuffDone(param) {
    return new Promise(function(resolve, reject) {
        // using a promise constructor
        console.log("getStuffDone starting");
        myPromiseFn(param+1)
        .then(function(val) {
            console.log("getStuffDone executing");
            resolve(val);
        }).catch(function(err) {
            console.log("getStuffDone error");
            reject(err);
       });
   });
}

2 个答案:

答案 0 :(得分:5)

只需在日志记录回调中返回或重新抛出原始值,then()将为您提供同样的承诺。

承诺的全部意义在于它们很容易像这样链接。

return myPromiseFn(param+1)
     .then(function(val) {
         console.log("getStuffDone executing");
         return val;
     }).catch(function(err) {
         console.log("getStuffDone error");
         throw err;
     });

答案 1 :(得分:0)

SLaks说的是什么。作为返回/重新抛出的替代方法,它也适用于分支您的链:

let co = require('co');
let parallel = require('co-parallel');
let sequelize = require('sequelize'); // also read documentation to provide connection details (this is just pseudocode)


let gen = function*() {
  let inputId = yield fetch_file_url(); // this function should be generator or should return promise
  let res = yield sequelize.query(`INSERT INTO... ${inputId} `);
}

co(function*() {
  let files = ['f1', 'f2', 'f3'];
  let gens = files.map(file => gen(file));
  let arrayOrResults = yield parallel(gens, 5);  // 5 threads
    // done
}).catch(function(err) {
  // catch errors
});

每个分支都是一个独立的链,因此日志记录不会以任何方式影响返回的var p = myPromiseFn(param+1); p.then(val => console.log("getStuffDone executing"), err => console.log("getStuffDone error")); return p;