【问题标题】:How to break out of promise in Javascript如何在 Javascript 中打破承诺
【发布时间】:2015-07-17 16:28:54
【问题描述】:

我已经开发了一个命令行程序及其工作,但是当它完成时它没有完成。我必须 control+c 一个 shell 才能退出

我是 javascript 新手。我必须通过回调来说明程序已完成吗?

我的代码:

importer.then(function (csvData) {
    var mySqlConnection = new MySqlConnection(config['phpipam-db']['host'], config['phpipam-db']['user'], config['phpipam-db']['password'], config['phpipam-db']['database']);
    var connection = mySqlConnection.getConnection();

    mySqlConnection.selectSubnets(connection).then(function (customerFolders) {
        var ipv6Data = manager.getIpv6CustomerSubnetsInsertData(csvData, customerFolders);
        var ipv4Data = manager.getIpv4CustomerSubnetsInsertData(csvData, customerFolders);

        mySqlConnection.insertIpv6Subnets(ipv6Data);
    });
});

【问题讨论】:

  • 你的程序比这更多,显然问题出在其他地方
  • 也许你需要关闭connection
  • 正在使用什么承诺库?什么版本的节点?

标签: javascript node.js callback promise


【解决方案1】:

var connection = mySqlConnection.getConnection();mySqlConnection.insertIpv6Subnets(ipv6Data); 之后添加console.log 语句。

如果它们被执行,则问题不在您发布的代码中。

如果没有,您必须检查您的承诺是否得到履行。

【讨论】:

  • 我运行后插入在数据库中
  • 你的一个承诺一定不能解决,这就是程序不会停止的原因
【解决方案2】:

这些方法:manager.getIpv6CustomerSubnetsInsertDatamySqlConnection.insertIpv6Subnets 是否也返回承诺?

如果你像这样修改你的代码,你能在控制台中看到 Done 吗?

importer.then(function (csvData) {
  var mySqlConnection = new MySqlConnection(config['phpipam-db']['host'], config['phpipam-db']['user'], config['phpipam-db']['password'], config['phpipam-db']['database']);
  var connection = mySqlConnection.getConnection();

  return mySqlConnection.selectSubnets(connection).then(function (customerFolders) {
    var ipv6Data = manager.getIpv6CustomerSubnetsInsertData(csvData, customerFolders);
    var ipv4Data = manager.getIpv4CustomerSubnetsInsertData(csvData, customerFolders);

    return mySqlConnection.insertIpv6Subnets(ipv6Data);
  }).then(function () {
    console.log('Done');
  });
});

【讨论】:

  • 但它帮助我找到了问题所在。这个承诺不能解决`importCsv(fileName: string): Promise { var stream = fs.createReadStream(fileName); var promise = new Promise(function (resolve, reject) { var result = new Array; var csvStream = csv().on("data", function (data) { result.push(data[0].split("; ")); }).on("end", function (end) { resolve(result); }); stream.pipe(csvStream); });回报承诺; }`
  • 看起来'end' 事件从未在csvStream 上发生过
  • 当我设置 //mySqlConnection.insertIpv6Subnets(ipv6Data);作为评论,程序正确结束
  • 所以问题在于这个方法insertIpv6Subnets,你必须显示里面的内容。
  • var post = { subnet: ip, mask : subnet, sectionId: sectionId, description: description, vrfId: 0, masterSubnetId: masterSubnetId, allowRequests: 0, vlanId: 0, showName: 0, pingSubnet: 0, discoverSubnet: 0, isFolder: 0 }; var query = this.getConnection().query('INSERT INTO subnets SET ?', post, function (err, result) { if (err) { return this.getConnection().rollback(function () { throw err; }); } }); 在这里
猜你喜欢
  • 2023-04-03
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 2014-03-12
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多