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

标签 javascript node.js promise

我问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/

相关文章:

javascript_include_tag :application loads javascripts twice in development environment

javascript - Bootstrap 模式没有响应

java - 使用 Maven,子模块如何继承父模块的存储库?

javascript - Protractor 和 promise

javascript - 如何将数据网格导出到excel?

javascript - 在socket.io范围之外使用var

node.js - 函数返回一个空数组

javascript - 请求 Stack Overflow API 返回奇怪的响应

javascript - 不知道如何在 react 中处理这个问题 - 多个 promise

javascript - 批量发送电子邮件并捕获不成功的尝试