采用js6到js5的代码

时间:2016-01-18 12:16:11

标签: javascript promise bluebird

我想使用这个示例代码,但我需要使用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);
        }
    };
},

2 个答案:

答案 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代码时就不再处理这些问题。