我正在看这个问题,答案是有道理的
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);
});
});
}
答案 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;
。