javascript – 如何在不使用延迟API的情况下从不允许返回值的函数返回promise?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 如何在不使用延迟API的情况下从不允许返回值的函数返回promise?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1927字,纯文字阅读大概需要3分钟。
内容图文
几天前我问了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?
内容总结
以上是互联网集市为您收集整理的javascript – 如何在不使用延迟API的情况下从不允许返回值的函数返回promise?全部内容,希望文章能够帮你解决javascript – 如何在不使用延迟API的情况下从不允许返回值的函数返回promise?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。