几天前我问了Is wrapping a promise in a promise an anti-pattern?,这让我想到了这一点.
在那种情况下,我不得不处理一个setTimeout,它不允许返回值.值得庆幸的是,你可以通过使用内置的延迟功能来处理这个问题(至少对于蓝鸟的承诺).
但是像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 };
导出不会是’blah’,因为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;
}
根据他们的wiki,这实际上并不被认为是反模式,但我看到延迟的使用沮丧很多.这似乎很重要,因为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?
那么你如何处理这些情况,通常你会使用事实上弃用的延期模式?
解决方法:
你命名你的变量myPromise,这是第一个提示,无论在=的另一边是什么,它应该是一个承诺.让我们开始吧
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')));
我确信这不是一个真正的用例,但它仍然适用.
另见:
> How do I convert an existing callback API to promises?
> How do I return the response from an asynchronous call?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。