Promise 既没有被解决也没有被拒绝。这可能是什么原因?
Promise is neither resolved nor rejected. What could be the reason for this?
我 运行 遇到了一个奇怪的问题。我正在使用一个模块从 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
总是被打印出来,但是 then
或 catch
中的语句都没有被执行。这可能是什么原因?
In the above snippet, the last console.log always gets printed but neither of the statement inside then or catch gets executed. What could be the reason for this?
您尝试承诺的函数不遵循所需的异步调用约定,因此以这种方式承诺它不会起作用。
为了使 Bluebird 的 promisify 正常工作,您 promisify 的函数必须遵循 node.js 异步调用约定。这意味着该函数必须将回调作为其最后一个参数,并且在操作完成时必须使用两个参数 err
和 result
调用该回调。如果函数不遵循这个约定,那么 promisify 将不起作用。
而且,真的没有理由采取同步操作并承诺它。承诺它不会突然使其功能异步。
因此,您的承诺永远不会得到解决或拒绝,因为底层函数不使用以正确的调用约定调用的回调。
因此,如果 geoip.lookup('52.39.138.72')
是完全同步的(看起来是这样)并以这种方式被调用,那么底层操作就不是异步的,因此甚至没有理由尝试承诺它。
如果您通过承诺来解释您实际试图解决的问题,我们可能会提供另一种方式(也许在一个新问题中)。关于堆栈溢出要记住的一件事。如果您描述您的实际问题并向我们展示相关代码,而不是询问有关一种尝试解决方案的问题,那么我们更有可能为您提供帮助并为您提供最佳解决方案。
我 运行 遇到了一个奇怪的问题。我正在使用一个模块从 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
总是被打印出来,但是 then
或 catch
中的语句都没有被执行。这可能是什么原因?
In the above snippet, the last console.log always gets printed but neither of the statement inside then or catch gets executed. What could be the reason for this?
您尝试承诺的函数不遵循所需的异步调用约定,因此以这种方式承诺它不会起作用。
为了使 Bluebird 的 promisify 正常工作,您 promisify 的函数必须遵循 node.js 异步调用约定。这意味着该函数必须将回调作为其最后一个参数,并且在操作完成时必须使用两个参数 err
和 result
调用该回调。如果函数不遵循这个约定,那么 promisify 将不起作用。
而且,真的没有理由采取同步操作并承诺它。承诺它不会突然使其功能异步。
因此,您的承诺永远不会得到解决或拒绝,因为底层函数不使用以正确的调用约定调用的回调。
因此,如果 geoip.lookup('52.39.138.72')
是完全同步的(看起来是这样)并以这种方式被调用,那么底层操作就不是异步的,因此甚至没有理由尝试承诺它。
如果您通过承诺来解释您实际试图解决的问题,我们可能会提供另一种方式(也许在一个新问题中)。关于堆栈溢出要记住的一件事。如果您描述您的实际问题并向我们展示相关代码,而不是询问有关一种尝试解决方案的问题,那么我们更有可能为您提供帮助并为您提供最佳解决方案。