【问题标题】:I'm trying to use the Bluebird's method Promisify and it's not working我正在尝试使用 Bluebird 的 Promisify 方法,但它不起作用
【发布时间】:2015-07-18 21:57:10
【问题描述】:

我无法在蓝鸟上制作一个简单的示例。我使用了 new Promise 方法并且它有效,但是当我尝试使用 Promisify 方法时,我可能做错了。

exports.makeRequest = function(someText){
    return Promise.resolve(someText);
}

var makeRequestAsync = Promise.promisify(exports.makeRequest);

makeRequestAsync('Testing').then(function(data){
    console.log(data); // --> log never appears
});

我真的很想了解 promisify 是如何工作的。

【问题讨论】:

  • 你不需要承诺它。只需调用makeRequest,它已经返回了一个已解决的承诺。

标签: javascript asynchronous promise bluebird


【解决方案1】:

Bluebird 的promisify() 仅适用于将回调作为最后一个参数的节点样式函数,其中回调有两个参数,一个错误和数据。您的函数不符合此条件。

您可以阅读它的工作原理here

此外,没有必要对已经返回承诺的函数进行承诺。您可以直接调用该函数并使用其返回的 Promise,因为它已经是一个 Promise 返回函数。

exports.makeRequest = function(someText){
    return Promise.resolve(someText);
}

exports.makeRequest('Testing').then(function(data){
    console.log(data);
});

工作演示:http://jsfiddle.net/jfriend00/n01zyqc6/


当然,由于您的函数实际上并不是异步的,因此似乎根本没有任何理由对它使用 Promise。


这是一个实际承诺异步并使用正确调用约定的示例:

exports.myFunc = function(data, callback) {
    // make the result async
    setTimeout(function() {
        // call the callback with the node style calling convention
        callback(0, data);
    }, 500);

};

var myFuncAsync = Promise.promisify(exports.myFunc);

myFuncAsync("Hello").then(function(result) {
    console.log(result);
});

【讨论】:

  • 谢谢!但是在这个例子中,我怎样才能使函数与 promisify 一起工作呢?
  • @ElvioCavalcante - 首先,在你自己的函数中使用 promisify 是没有意义的,它不像你那样异步。您已经编写了它来使用 Promise,因此无需进一步承诺它。其次,如果你阅读了我发布的链接,你只需要让你的函数遵循那里描述的nodeFunction 约定,然后你就可以调用它了。 promisify 仅适用于遵循特定调用约定的函数,然后它们必须在完成工作后使用正确的参数调用回调。
  • @ElvioCavalcante - 如果您描述了您要解决的真正问题,而不是尝试承诺已经承诺兼容的功能,那么我们可能都会变得更好,因此无需承诺它。
  • @ElvioCavalcante - 我在我的回答中添加了一个示例,承诺异步并遵循正确的调用约定以使用 .promisify()
  • 谢谢!!它绝对有效。我完全理解 promisify 的工作原理。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多