蓝鸟承诺没有打电话。然后间歇地

时间:2016-03-08 18:02:50

标签: javascript bluebird

我正在学习蓝鸟并在我的代码中实现如下:

var getPromiseA = new Promise(function (resolve, reject) {
 executeCommand('command A')
     .then(function (result) {
         var temp = JSON.parse(result);
         for (var i in temp) {
             if (temp[i].abc === 'ABC') {
                 resolve(temp[i]);
             }
         }
     }).catch(function (err) {
         console.log('Error occurred while executing getPromiseA :::');
         reject(err);
     });
  });

 var getPromiseB = new Promise(function (resolve, reject) {
     executeCommand('command B')
         .then(function (result) {
             resolve(JSON.parse(result));
         })
         .catch(function (err) {
             console.log('Error occurred while executing getPromiseB :::');
             reject(err);
         });
 });

 var getPromiseC = new Promise(function (resolve, reject) {
     executeCommand('command C')
         .then(function (result) {
             var temp = JSON.parse(result);
             for (var i in temp) {
                 console.log('in command C::::');
                 if (temp[i].abc != null) {
                     resolve(temp[i]);
                 }
             }
         })
         .catch(function (err) {
             console.log('Error occurred while executing getPromiseC :::');
             reject(err);
         });
 });

 function executeCommand(inputCmd) {
     var commandPromise = new Promise(function (resolve, reject) {
         var response = {}, err = {};
         var command = exec(inputCmd);
         command.stdout.on('data', function (data) {
             response = data;
         });
         command.stderr.on('data', function (data) {
             err = data;
         });
         command.on('close', function (code) {
             console.log('coming in close' + code);
             if (code === 0) {
                 console.log('before resolving in executeCommand');
                 resolve(response);
                 console.log('after resolving in executeCommand' + JSON.stringify(response));

             }
             else {
                 reject(code);
             }
         });
     });
     return commandPromise;
 }

在此之后我使用Promise.all函数来解决所有的承诺。 我在解决getPromiseC时遇到了这个问题。 PromiseC没有进入.then。 我无法弄清楚是什么原因。

输出如下所示:    对于getPromiseA -     1.在executeCommand中解析     2.在executeCommand中解析 - {data}     3.getPromiseA。然后

对于getPromiseB -    1.在executeCommand中解析    2.在executeCommand中解析 - {data}    3.getPromiseB。然后

对于getPromiseC -    1.在executeCommand中解析    2.在executeCommand中解析 - {data}

不打印' getPromiseC。然后' 控制卡在这里。但是当再次尝试执行该功能时,它解决了所有的承诺,即我可以看到getPromiseC。然后在我的控制台中打印。

我被困了,因为这个问题是间歇性发生的。重新加载解决了这个问题。 当我多次调用该函数时,我发现这个解决问题是随机发生的。

有人可以帮助我了解这段代码的错误吗?

1 个答案:

答案 0 :(得分:1)

您应该避免使用Promise constructor antipattern

require 'capybara'
require 'capybara/poltergeist'

class NilLogger
  def puts * ; end
end

def setup_session
  driver_options = { js_errors: false,
                     logger: NilLogger.new,
                     phantomjs_logger: STDOUT,
                     phantomjs_options: ['--debug=true'],
                     debug: false  }
  Capybara.configure do |conf|
    conf.run_server = false
    conf.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new app, driver_options
    end
    conf.current_driver = :poltergeist
  end
  Capybara.current_session
end

browser = setup_session()
browser.visit 'https://www.whoscored.com/LiveScores'
browser.save_page 'page.html'

通过这种方式,您还可以消除错误的来源:如果在var promiseA = executeCommand('command A').then(function (result) { var temp = JSON.parse(result); for (var i in temp) { if (temp[i].abc === 'ABC') { return temp[i]; // ^^^^^^ } } }).catch(function (err) { console.log('Error occurred while executing getPromiseA :::'); throw err; }); var promiseB = executeCommand('command B').then(JSON.parse).catch(function (err) { console.log('Error occurred while executing getPromiseB :::'); throw err; }); var promiseC = executeCommand('command C').then(function (result) { var temp = JSON.parse(result); for (var i in temp) { console.log('in command C::::'); if (temp[i].abc != null) { return temp[i]; // ^^^^^^ } } }).catch(function (err) { console.log('Error occurred while executing getPromiseC :::'); throw err; }); 中找不到合适的值,则承诺永远不会得到解决。您的承诺现在将使用回调函数隐式返回的temp值来解析。