我问Is wrapping a promise in a promise an anti-pattern?几天前,这让我想到了这一点。
在这种情况下,我必须处理 setTimeout
,它不允许返回值。值得庆幸的是,您可以使用内置的 delay
函数来处理这个问题(至少对于 bluebird Promise 来说)。
但是对于像 gulp 任务这样的事情呢?也受到另一个问题的启发:How to pass an object from gulpfile to another JavaScript file in nodejs?
var stuff;
gulp.task('LoadYamlFiles', function() {
// do stuff
stuff = 'blah';
});
module.exports = { stuff };
导出不会是“废话”,因为 gulp 任务是异步运行的。这可以使用 promise 来解决。
一种方法是使用延迟(代码来自 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;
}
根据他们的 wiki,这实际上并不被认为是反模式,但我发现 deferred
的使用非常不受欢迎。承认这一点似乎很重要,因为 bluebird 的 API 中甚至不再有 .pending()
方法,这意味着即使我想这样做,我也无法真正做到这一点。
但是你不能这样做:
var stuff;
var myPromise = gulp.task('LoadYamlFiles', function() {
return new Promise(function(resolve, reject) {
// do stuff
stuff = 'blah';
resolve(stuff);
})
});
module.exports = { myPromise };
因为匿名函数的返回值不是 myPromise
将包含的内容。它还会导致您在此处看到的问题 Does a gulp task have to return anything?
那么,您如何处理这些通常会使用事实上已弃用的 deferred
模式的情况?
最佳答案
您将变量命名为 myPromise
,这是第一个暗示,无论 =
另一侧是什么,它都应该是一个 promise 。那么让我们开始吧
var myPromise = new Promise((resolve, reject) => {
// todo
});
module.exports { myPromise };
现在,让我们填写详细信息。
var myPromise = new Promise((resolve, reject) => {
gulp.task('LoadYamlFiles', function() {
let stuff = 'blah';
resolve(stuff);
});
});
一些重构给我们带来了
let myPromise = new Promise(resolve =>
gulp.task('LoadYamlFiles', () => resolve('blah')));
我确信这不是一个真正的用例,但它仍然可以应用。
另请参阅:
关于javascript - 在不使用延迟 API 的情况下,如何从不允许返回值的函数返回 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34710730/