承诺既未得到解决也未被拒绝。这可能是什么原因?

时间:2017-03-21 04:35:21

标签: node.js ecmascript-6 promise bluebird

我遇到了一个奇怪的问题。我正在使用一个模块从IP地址中查找地理位置。默认情况下,查找方法为sync

我使用bluebird将方法转换为异步,但其承诺永远不会得到解决或拒绝!

以下是摘录:

var Promise = require('bluebird');
var geoip = Promise.promisifyAll(require('geoip-lite'));


geoip.lookupAsync('52.39.138.72').then((r) => {
    console.log(r);
}).catch((err) => {
    console.log(err);
})

console.log(geoip.lookup('52.39.138.72').country + '^^^^');

在上面的代码段中,始终会打印最后一个console.log,但thencatch内的语句都不会被执行。这可能是什么原因?

1 个答案:

答案 0 :(得分:2)

  

在上面的代码片段中,最后一个console.log始终被打印,但是当时或者catch中的语句都没有被执行。这可能是什么原因?

您尝试promisify的函数不遵循必需的异步调用约定,因此以这种方式进行保证将不起作用。

对于Bluebird的promisify正常工作,你实现的函数必须遵循node.js异步调用约定。这意味着该函数必须将回调作为其最后一个参数,并且在操作完成时必须使用两个参数errresult调用该回调。如果该功能不符合此约定,则宣传它将不起作用。

并且,实际上没有理由采取同步操作并将其宣传。满足它不会突然使其功能异步。

因此,您的承诺永远不会得到解决或拒绝,因为基础函数不会使用通过正确调用约定调用的回调。

所以,如果geoip.lookup('52.39.138.72')完全同步(看起来像是这样)并且以这种方式调用,那么底层操作就不是异步的,所以没有理由甚至尝试将它同化。< / p>

如果你通过宣传来解释你实际上试图解决的问题,我们可能会提供另一种方式(也许是在一个新问题中)。有关堆栈溢出的一点要记住。如果您描述实际问题并向我们展示相关代码而不是询问一个尝试解决方案的问题,那么我们更有可能帮助您并为您提供最佳解决方案。