Интервал использования с arguments.callee прерывает поведение "require"
Я довольно смущен, почему некоторые "требуют"
возвращает ошибку:
Ошибка типа: require не является функцией в Timeout._onTimeout (...........index.js:8:18)
Когда выполняется следующее:
(()=> {
console.time("pipeline")
pipeline().then((result) => {
console.log("Then: " + result)
console.log("Work Complete for iteration: " + i + " calling iteration no:", i = i + 1)
setTimeout(arguments.callee, 1000);
}).catch((error) => {
console.error("error occured with promise resolution: " + error)
});
console.timeEnd("pipeline")
})()
он запускается один раз, затем ошибки (хотя я, очевидно, подключен к БД)
но работает, как и ожидалось, при изменении на этот формат:
(function () {
console.time("pipeline")
pipeline().then((result) => {
console.log("Then: " + result)
console.log("Work Complete for iteration: " + i + " calling iteration no:", i = i + 1)
setTimeout(arguments.callee, 1000);
}).catch((error) => {
console.error("error occured with promise resolution: " + error)
});
console.timeEnd("pipeline")
})()
Ошибка предполагает, что это связано с тайм-аутом, который я думаю, потому что он выполняется один раз, прежде чем выдать ошибку.
Почему происходит такое поведение? Это относится к arguments.callee и если да, то почему?
Заранее спасибо,
1 ответ
arguments
ссылается на область родительской функции в случае функции стрелки. Функции стрелок не имеют собственныхarguments
,
Модули Node.js обернуты с помощью функции обертки модулей под капотом:
(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});
Это то, что arguments.callee
относится к внутренней функции стрелки. призвание arguments.callee
приводит к повторной оценке текущего модуля с неверными аргументами, require
особенно.
Надеется arguments.callee
взломан Лучший способ сделать это - явно обратиться к функции:
(function foo() {
...
setTimeout(foo, 1000);
...
})()
В то время как стрелка потребует, чтобы область видимости блока не просочилась foo
в родительскую область:
{
let foo;
(foo = () => {
...
setTimeout(foo, 1000);
...
})()
}