日志记录时避免 Promise 构造函数反模式

Avoid Promise constructor antipattern when logging

我正在看这个问题,答案很有意义

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);
       });
   });
}

只要 return 或在您的日志记录回调中重新抛出原始值,then() 就会给您同样的承诺。

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

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

SLaks 说的。作为 return/rethrow 的替代方案,它也适用于 branch 你的链:

var p = myPromiseFn(param+1);
p.then(val => console.log("getStuffDone executing"),
       err => console.log("getStuffDone error"));
return p;

每个分支都是一个独立的链,因此日志记录不会以任何方式影响返回的p