【发布时间】:2016-01-10 21:01:49
【问题描述】:
几天前我问过Is wrapping a promise in a promise an anti-pattern?,这让我想到了这个。
在那种情况下,我不得不处理一个setTimeout,它不允许返回值。幸运的是,您可以使用内置的 delay 函数来处理这个问题(至少对于 bluebird 承诺)。
但是对于像 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 模式的情况?
【问题讨论】:
-
afaik,“延迟”只是作为 jQuery 中的特定事物“弃用”,而不是一般的概念。也就是说,您可以在回调之外做出承诺并从回调内部解决它...
-
我使用
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));,然后在其他地方避免setTimeout,因为它的错误处理特性很差。
标签: javascript node.js promise