我想使用这个示例代码,但我需要使用javaScript5而不是6,因为我们正在使用节点0.12.7并且现在无法升级。 (我用蓝鸟)
这是js6中的代码
checkAppPort: function(port, retriesLeft) {
return new Promise((resolve, reject) => {
this.checkPortStatus(port, host).then(resolve, error => {
setTimeout(() => {
this.checkAppPort(port, retriesLeft - 1).then(resolve, reject);
}, 1000);
});
});
现在我已将其更改为以下但我收到了错误
[ReferenceError:未定义解析]
return new Promise(resolve, reject), function () {
this._checkPortStatus(port, HOST).then(resolve, error), function () {
console.log("Waiting for App to start: checking port: " + port + " attempt: " + retriesLeft);
setTimeout(function () {
this.checkAppPort(port, retriesLeft - 1).then(resolve, reject);
}, 1000);
}
};
},
答案 0 :(得分:2)
通过babel运行ES2015代码
checkAppPort: function checkAppPort(port, retriesLeft) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.checkPortStatus(port, host).then(resolve, function (error) {
setTimeout(function () {
_this.checkAppPort(port, retriesLeft - 1).then(resolve, reject);
}, 1000);
});
});
}
理想的解决方案是改变您的ES2015以避免新的承诺等等等等等等
正如您已使用Bluebird标记
checkAppPort: function checkAppPort(port, retriesLeft) {
var _this = this;
return this.checkPortStatus(port, host)["catch"](function (error) {
return retriesLeft > 0 ? Promise.delay(1000, function () {
return _this.checkAppPort(port, retriesLeft - 1);
}) : Promise.reject(error);
});
}
我认为这是等效代码(ES5) - ES6版本是
checkAppPort: function (port, retriesLeft) {
return this.checkPortStatus(port, host)
.catch(error => retriesLeft > 0 ? Promise.delay(1000, () => this.checkAppPort(port, retriesLeft - 1)) : Promise.reject(error))
}
我认为这可能不是"最严重的"代码的版本,但是
回答评论
在ES5中
checkAppPort: function checkAppPortAlt(port, retries) {
var _this = this;
var checkit = function checkit(retriesLeft, retry) {
if (retry) {
console.log("Retry ...", retry);
}
return _this.checkPortStatus(port, host)["catch"](function (error) {
return retriesLeft > 0 ? Promise.delay(1000, function () {
return checkit(retriesLeft - 1, retry + 1);
}) : Promise.reject(error);
});
};
return checkit(retries, 0);
}
在ES2016中
checkAppPortAlt: function (port, retries) {
var checkit = (retriesLeft, retry) => {
if(retry) {
console.log("Retry ...", retry);
}
return this.checkPortStatus(port, host)
.catch(error => retriesLeft > 0 ? Promise.delay(1000, () => checkit(retriesLeft - 1, retry + 1)) : Promise.reject(error))
};
return checkit(retries, 0);
}
未经测试,但可能是正确的:D - 我担心ES2015代码中this
的正确性 - 尽管如此,babel似乎将其转换为适用于ES5的内容
答案 1 :(得分:1)
你有一些奇怪的语法。就像你试图调用SELECT SUM (UNCOLLECTED)
FROM LIQUIDATIONSDETAILS LD
WHERE LD.COMPANYID = L.COMPANYID
AND LD.GROUPID = L.GROUPID
AND LD.PERIODID = L.PERIODID
AND (L.PERIODID > '2013-2014' AND LD.FORMTYPE IN (1, 2, 3) )
OR (L.PERIODID <= '2013-2014' AND LD.FORMTYPE IN (1, 2, 3,4) )
和new Promise(resolve, reject)
一样(即使有效,也不是你想要的)。
您应该执行以下操作:
.then(resolve, reject)
我刚修正了您的函数调用以接收new Promise(function (resolve, reject) {
this._checkPortStatus(port, HOST).then(resolve, function () {
...
});
});
和resolve
作为这些函数的参数。
另外,正如@Jaromanda X评论的那样,你最好尝试Babel将代码从ES6转换为ES5,这样你在转换JS代码时就不再处理这些问题。