
在技术面试中,除检查理论知识外,习惯上设置任务以评估应聘者的实践知识水平,其编写代码的能力以及逻辑和算法思维的能力。通常,此列表包括算法问题。每个人都已经习惯了它们,在准备时,首先,他们要看着他们。 列表很长,但是最常见的主要内容是这样的:
- 阶乘
- 斐波那契数
- 数组元素的唯一性
- 检查文本中的括号
- (mergeSort, insertionSort, bubbleSort, quickSort)
- ( / / )
, 70 JavaScript, , , , ( , ).
, :
, , .
:
, :
:
fetch(url1) => fetch(url2, resultsUrl1) => fetch(url3, resultsUrl2)
-
compose(res2 => fetch(url3, res2), res1 => fetch(url2, res1), () => fetch(url1))
?
, ( ):
, , ( reduce, ).
, ; , - ; ; .
, . . , , , .
, reduce , Array. :
, fetch , :
function fakeFetch (url, params='-') {
    
    console.log(`fakeFetch to: ${url} with params: ${params}`);
    return new Promise(resolve => {
        setTimeout(() => resolve(`${url} is DONE`), 1000);
    })
};
( ):
const urls = ['url1', 'url2', 'url3'];
( 1), . then().then().then() await; await; await; .
, callback. :
fetchSeries(result => console.log(`result: ${result}`))
, . , , .
, , . , , , .
function generatorWay(callback) {
    function* generateSequence() {
        let results;
        for (let i = 0; i < urls.length; i++) {
            results = yield fakeFetch(urls[i], results);
        }
        return results;
    }
    function execute(generator, yieldValue) {
        let next = generator.next(yieldValue);
        if (!next.done) {  
            return next.value
                .then(result => execute(generator, result));
        } else {
            callback(next.value);
        }
    }
    execute(generateSequence())
}
:
- generateSequence yield', .
- execute(generator),- next, — , , ,- next.
- execute, callback.
, while:
async function asyncGeneratorWay(callback) {
    async function* generateSequence() {
        let results;
        for (let i = 0; i < urls.length; i++) {
            results = yield await fakeFetch(urls[i], results);
        }
        return results;
    }
    let generator = generateSequence();
    let result;
    while (!result || !result.done) {
        result = await generator.next(result && result.value);
    }
    callback(result.value);
}
( ).
for await of , 2.
Async/await
. , async/await. , async, .
async function asyncAwaitWay(callback) {
    const series = async () => {
        let results;
        for (let i = 0; i < urls.length; i++) {  
            results = await fakeFetch(urls[i], results);
        }
        return results;
    }
    const result = await series();
    callback(result);
}
fakeFetch await;
Recursion
, reduce ( ), recursion . . , :
function recursionWay(callback) {  
    const recursion = (arr = [], promise = Promise.resolve()) => {
        if (!arr.length) { 
            return promise;
        }
        const [url, ...restUrls] = arr;
        return promise
            .then(res => recursion(restUrls, fakeFetch(url, res)));
    }
    recursion(urls)
        .then(result => callback(result));
}
shift , . .
Promise.resolve(), -, , , .
Reduce
, , . , , .
function reduceWay(callback) {
    urls
        .reduce((accum, item) => {
            return accum
                .then(res => fakeFetch(item, res))
        }, Promise.resolve())
        .then(result => callback(result));
}
:
- fakeFetch then;
- , Promise.resolve(), -, , (Promise) , . :
function reduceWay(callback) {
    urls
        .reduce((accum, item) => {
            if (!accum) {
                return fakeFetch(item);
            }
            return accum
                .then(res => fakeFetch(item, res));
        })
        .then(result => callback(result));
}
2 .
. , :
"", , reduce. , ( ). , , :
const reduceWay = callback => urls.reduce(
    (acc, item) => acc.then(res => fakeFetch(item, res)),  
    Promise.resolve())
    .then(result => callback(result));  
}
, , , .
, — . async/await — , . reduce / .
, , … .
发电机
异步发电机
数组:迭代减少
递归
异步/等待
承诺
承诺链
UPD在注释之后,我对async / await方法进行了一些调整。确实,可以使用以下方法来缩短该方法并提供更大的可见性for of:
async function asyncAwaitWay(callback) {
    let results;
    for (const url of urls) {  
        results = await fakeFetch(url, results);
        }
    callback(result);
}