gpt4 book ai didi

javascript - 使用 Function.prototype.bind() 部分应用 mkdirp

转载 作者:行者123 更新时间:2023-11-29 21:00:20 26 4
gpt4 key购买 nike

我正在阅读一本关于 Node 设计模式的书,这是第 99 页的一些代码 here :

function download(url, filename, callback) { 
console.log(`Downloading ${url}`);
let body;

async.series([
callback => { //[1]
request(url, (err, response, resBody) => {
if(err) {
return callback(err);
}
body = resBody;
callback();
});
},

mkdirp.bind(null, path.dirname(filename)), //[2]

callback => { //[3]
fs.writeFile(filename, body, callback);
}
], err => { //[4]
if(err) {
return callback(err);
}
console.log(`Downloaded and saved: ${url}`);
callback(null, body);
});
}

我没有关注 //[2] 发生的事情。这本书说你正在部分地应用绑定(bind)的功能。根据我对 mdn here 的理解,当您使用 bind 时,您不会调用该函数。

如果您稍后不调用 mkdirp(),这段代码如何工作?是否通过 fs.writeFile 中的 callback 参数引用?

我有一个可能的解决方案。您将 async.series 交给它将通过并执行的函数列表。 mozilla mdn 说 bind 返回一个准备执行的函数。如果您使用 callapply,您将获得该函数的结果。 async.series 想要执行一个函数,因此您可以使用 bind 让它在不运行的情况下就绪。

最佳答案

你误读了代码。 mkdirp.bind(... 没有在代码中的任何地方调用,而是在 async.series 调用中调用,更准确地说是在其参数声明中(数组 [] ). async.series 将一个包含函数引用的数组作为参数,并将按顺序依次调用它们。

  1. //[1] 被调用,
  2. 然后 //[2] 被调用,它是对已经与参数绑定(bind)的 mkdirp 的引用(你可以看到一个例子 here )
  3. 等等...

为了让你更清楚,代码可以这样写:

function download(url, filename, callback) {
console.log(`Downloading ${url}`);
let body,
getFile = callback => {
request(url, (err, response, resBody) => {
if (err) {
return callback(err);
}
body = resBody;
callback();
});
},
boundMkdirp = mkdirp.bind(null, path.dirname(filename)),
writeFile = callback => {
fs.writeFile(filename, body, callback);
};

async.series([
getFile,
boundMkdirp,
writeFile
], err => {
if (err) {
return callback(err);
}
console.log(`Downloaded and saved: ${url}`);
callback(null, body);
});
}

关于javascript - 使用 Function.prototype.bind() 部分应用 mkdirp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com