附件是我写的问题和解决方案代码。基本上回调应该是控制台按升序记录输出而不是它接收的顺序。
function processRequest(i, callback) {
setTimeout(function() {
callback('Action processed ' + i);
}, Math.random() * 1000);
}
callAction(6);
callAction(count) {
//write code here
}
预期输出>>
Action processed 1
Action processed 2
Action processed 3
Action processed 4
Action processed 5
Action processed 6
我知道这不是解决这个问题的最佳方法。有人可以评价我的解决方案并可能提出更好的方法吗?我猜的是异步的东西?
非常感谢!谢谢。
function processRequest(i, callback) {
setTimeout(function() {
callback('Action processed ' + i);
}, Math.random() * 1000);
}
callAction(6);
function callAction(count) {
const arr = [];
let counter = 0;
for (let i = 1; i <= count; i++) {
arr[i - 1] = i;
}
for (let i = 1; i <= count; i++) {
processRequest(i, function(str) {
counter++;
let currentActionNum = parseInt(str.match(/\d+/g));
let message = str.substr(0, str.indexOf(currentActionNum));
if (currentActionNum === arr[0]) {
console.log(message + currentActionNum);
arr.shift();
}
if (counter === count) {
for (let i = arr[0]; i <= count; i++) {
console.log(message + i);
}
}
});
}
}
答案 0 :(得分:0)
我认为采访者希望你做的是确保这些流程以正确的顺序运行(现实生活中的流程会有所不同,而不仅仅是打印一些字符串)。所以,这是一个更好的解决方案:
function callAction(count){
i = 1;
cb = function(str){
console.log(str)
count-i++ && processRequest(i, cb) //'same' as: if (count-i++>0) then ...
}
processRequest(1, cb)
}
出于好奇,我可以问一下这是面对面的采访吗?你有权使用电脑吗?你需要多长时间才能解决这个问题?如果我没有计算机和我一起试试,那么我可能会做得比这更糟糕......
答案 1 :(得分:0)
您的任务不是使用超复杂的处理来重写输出以正确的顺序出现,而是确保6个进程按顺序运行。你可以用一个简单的递归方法来做到这一点:
function callAction(count) {
if (count > 1)
processRequest(7 - count, result => {
// ^^^^^^^^^ ok, that part is a bit weird
console.log(result);
callAction(count - 1);
});
}