I asked 将承诺包装在承诺中是反模式吗?几天前,这让我想到了这一点。
在那种情况下,我必须处理一个setTimeout
,它不允许返回值。值得庆幸的是,您可以使用内置的delay
功能(至少对于蓝鸟承诺)。
但是对于像 gulp 任务这样的事情呢?也受到另一个问题的启发:如何在nodejs中将对象从gulpfile传递到另一个JavaScript文件?
var stuff;
gulp.task('LoadYamlFiles', function() {
// do stuff
stuff = 'blah';
});
module.exports = { stuff };
导出不会是“废话”,因为 gulp 任务是异步运行的。这可以使用承诺来解决。
您可以做到这一点的一种方法是使用延迟(代码来自https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns):
// setTimeout that returns a promise
function delay(ms) {
var deferred = Promise.pending();
setTimeout(function(){
deferred.resolve();
}, ms);
return deferred.promise;
}
根据他们的维基,这实际上并不被认为是反模式,但我看到了deferred
灰心了很多。承认这一点似乎很重要,因为蓝鸟甚至没有.pending()
他们的 API 中不再有方法,这意味着即使我愿意,我也不能真正这样做。
但是你不能这样做:
var stuff;
var myPromise = gulp.task('LoadYamlFiles', function() {
return new Promise(function(resolve, reject) {
// do stuff
stuff = 'blah';
resolve(stuff);
})
});
module.exports = { myPromise };
因为匿名函数的返回值不是myPromise
将包含。它还会导致您在这里看到的问题gulp 任务必须返回任何东西吗?
那么,您如何处理这些情况,通常您会使用事实上已弃用的deferred
图案?