【发布时间】:2016-05-05 15:26:48
【问题描述】:
参数et 和instance,传递给promisified 的函数在return new promise 块中不可见(被视为null)。 注意:
rp = require('request-promise');
Promise = require('bluebird');
.. 和我自己的一些模块,如 urlLib,在顶部是“必需的”。 rp 库是承诺的请求库...如果我在 return 语句中明确设置 et 和实例变量,它就可以工作。 (参见注释的 et 和实例声明)。
module.exports.getEntityInstance = function (et, instance) {
return new Promise(function(resolve, reject) {
// explicit setting, to test, works fine.
// var et = "device", instance = "33";
if ((!et) || (!instance)) {
// ****** FAILING HERE *******
reject(new Error(utilLib.errorAsJSON ("Invalid et/instance arg")));
}
OPTS.url = base_url + et + "/" + instance;
rp(OPTS)
.then(function (data) {
resolve(data)
})
.catch(function (err) {
reject(err);
});
});
}
这是纯正的代码:
module.exports.em7GetEntityInstance = function (et, instance) {
log.info("----- et before promise:(" + et + ")");
log.info("----- instance before promise:(" + instance + ")");
return new Promise(function(resolve, reject) {
// var et = "device";
// var instance = "33";
// if null or undefined...
if (!et || !instance) {
log.error("---- et and/or instance args null. rejecting");
reject(new Error(utilLib.errorAsJSON ("getEntityInstace():Invalid entity type argument")));
}
var et = et.toLowerCase().trim();
var url = baseurl + et + "/" + instance
log.info("url:(" + url + ")");
OPTS.url = url;
rp(OPTS)
.then(function (data) {
log.debug ("success. invoking resolve()");
resolve(data)
})
.catch(function (err) {
log.error("+++ rp failed:(" + err + ")");
reject(err);
});
});
}
还有日志语句(它是一个服务器进程(没有 console.log)。使用 winston 日志模块。
2016-05-05T15:44:06.866Z - info: ----- et before promise:(device)
2016-05-05T15:44:06.867Z - info: ----- instance before promise:(33)
2016-05-05T15:44:06.867Z - error: ---- et and/or instance args null. rejecting
【问题讨论】:
-
它们是可见的,除非你通过重新声明
var et, instance来隐藏它们。请告诉我们您的电话,您更有可能通过null。 -
它们将是可见的。
.getEntityInstance()函数中还会发生什么?您是否使用过console.log()或浏览器调试器来查看参数在 Promise 之外具有哪些值? -
是的,我在输入 getEntityInstance 后使用日志记录,在输入 return 后使用日志记录 - 我看到 null。我已经注释掉了这些设置,因为我想测试以确保其余功能按预期工作,如果值可用 - 确实如此。所以现在评论的阴影是为了测试。 @Bergi - 你能建议这里的正确模式是什么,以避免我的反模式吗? => 我看到了链接,应该可以了!! - 因为那里没有明确的包装器 return(function()){}。虽然我这样做了,但有什么建议为什么上面失败了?
-
@user3213604:请发布包含
console.log语句的代码以及您获得的确切控制台输出。
标签: javascript node.js scope promise bluebird