我正在学习蓝鸟并在我的代码中实现如下:
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。然后在我的控制台中打印。
我被困了,因为这个问题是间歇性发生的。重新加载解决了这个问题。 当我多次调用该函数时,我发现这个解决问题是随机发生的。
有人可以帮助我了解这段代码的错误吗?
答案 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
值来解析。