函数参数在 return new Promise(function(resolve, reject) 中不可见
function args not visible inside return new Promise(function(resolve, reject)
参数 et 和实例,传递给被承诺的函数在 [=31] 中不可见(被视为 null) =] 新的承诺块。
注:
rp = require('request-promise');
Promise = require('bluebird');
.. 而我自己的一些模块(如 urlLib)在顶部 'required'。
rp 库是 promisified 请求库...如果我在 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
确实会从外部作用域中隐藏同名变量。评估测试时 undefined
。
避免使用 var
,使用不同的变量名,或者直接使用
var url = baseurl + et.toLowerCase().trim() + "/" + instance;
完全没有中间变量。
但是,而不是
module.exports.em7GetEntityInstance = function(et, instance) {
log.info("----- et before promise:(" + et + ")");
log.info("----- instance before promise:(" + instance + ")");
// if null or undefined...
if (et==null || instance==null) {
log.error("---- et and/or instance args null. rejecting");
return Promise.reject(new Error(utilLib.errorAsJSON ("getEntityInstace():Invalid entity type argument")));
}
var url = baseurl + et.toLowerCase().trim() + "/" + instance;
log.info("url:(" + url + ")");
OPTS.url = url;
return rp(OPTS).then(function(data) {
log.debug ("success. invoking resolve()");
return data;
}, function(err) {
log.error("+++ rp failed:(" + err + ")");
throw err;
});
};
参数 et 和实例,传递给被承诺的函数在 [=31] 中不可见(被视为 null) =] 新的承诺块。 注:
rp = require('request-promise');
Promise = require('bluebird');
.. 而我自己的一些模块(如 urlLib)在顶部 'required'。 rp 库是 promisified 请求库...如果我在 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
确实会从外部作用域中隐藏同名变量。评估测试时 undefined
。
避免使用 var
,使用不同的变量名,或者直接使用
var url = baseurl + et.toLowerCase().trim() + "/" + instance;
完全没有中间变量。
但是
module.exports.em7GetEntityInstance = function(et, instance) {
log.info("----- et before promise:(" + et + ")");
log.info("----- instance before promise:(" + instance + ")");
// if null or undefined...
if (et==null || instance==null) {
log.error("---- et and/or instance args null. rejecting");
return Promise.reject(new Error(utilLib.errorAsJSON ("getEntityInstace():Invalid entity type argument")));
}
var url = baseurl + et.toLowerCase().trim() + "/" + instance;
log.info("url:(" + url + ")");
OPTS.url = url;
return rp(OPTS).then(function(data) {
log.debug ("success. invoking resolve()");
return data;
}, function(err) {
log.error("+++ rp failed:(" + err + ")");
throw err;
});
};