微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 如何在不使用延迟API的情况下从不允许返回值的函数返回promise?

几天前我问了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 举报,一经查实,本站将立刻删除。

相关推荐