привязать аргументы к функции javascript - PullRequest
2 голосов

Я пытаюсь запустить второй запрос, когда первый был разрешен следующим образом:

const fn1 = secondQuery => $.get('1.json', data => secondQuery());
const fn2 = secondQuery => $.get('2.json', data => secondQuery());
const fn3 = secondQuery => $.get('3.json', data => secondQuery());
const fn4 = secondQuery => $.get('4.json', data => secondQuery());

const queries = [fn1, fn2, fn3, fn4];

const queriesWithArgs = queries.map((queryFn, index, arr) => {
    const nextQuery = arr[index + 1];

    if (!nextQuery) {
        return
    }

    return queryFn.bind(queryFn, nextQuery);
});

queriesWithArgs[0]();

, но все еще получаю ошибку TypeError: secondQuery не является функцией, в то время как запросы к 1.json и 2.json работаютштраф fn2, кажется, не получает fn3 в качестве аргумента.Можете ли вы объяснить, как это работает?

1 Ответ

2 голосов
/ 16 марта 2019

Вы, кажется, думаете, что аргумент arr относится к массиву queriesWithArgs, так что вы можете взять свой nextQuery оттуда.Это не так, это относится к исходному массиву queries, и вы вызываете эти nextQuery функции без дополнительного аргумента.

Вместо этого, правильный инструмент для использования здесь - reduceRight, а не map, где nextQuery аккумулятор действительно ссылается на предыдущий результат (или начальное значение, здесь обратный вызов last):

const queries = [fn1, fn2, fn3, fn4];

const run = queries.reduceRight((nextQuery, queryFn) => {
    return queryFn.bind(null, nextQuery);
}, function last() {
    console.log("done");
});

run();
...