gpt4 book ai didi

node.js - Promise.then() 中的 for 循环?

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:55 24 4
gpt4 key购买 nike

我需要在两个值之间进行迭代,并在每次迭代时创建/触摸文件(I/O)。

我正在使用fs-promise异步执行此操作的模块:

const path = require('path');
const fsp = require('fs-promise');


function addPages(startAt, pages, mode) {
let htmlExt = mode.HTML;
let cssExt = mode.CSS;

fsp.readFile(path.join('.', 'templates', 'body.html'), { encoding: 'utf-8' })
.then((content) => {
// return Promise.all(() => {}).then().catch(); // Do this.

for (let i = startAt, endAt = startAt + pages; i < endAt; i++) {
console.log(i);

fsp.writeFile(path.join('.', 'manuscript', `page-${i}`, `style.${cssExt}`), '')
.then(() => { console.log('Yay!') })
.catch(console.log.bind(console));

// fsp.writeFile(path.join('.', 'manuscript', `page-${i}`, `style.${cssExt}`), '')
// .then((i, templateHTML) => {
// fsp.writeFile(path.join('.', 'manuscript', `page-${i}`, `body.${htmlExt}`), content);
// })
// .catch((err) => {
// console.log.bind(console);
// });

}

})
.catch((err) => {
if (err) return error('Couldn\'t create pages', err);
});

现在我做到了read Promises.all([Array of Promises]) 是在 then() 范围内循环的方法,但问题是为什么/如何?

我无法理解为什么在上下文移出 promise 的 then() 范围之前不执行 for-loop ,以及我应该如何获得预期结果。

最佳答案

const path = require('path');
const fsp = require('fs-promise');

function addPages(startAt, pages, mode) {
let htmlExt = mode.HTML;
let cssExt = mode.CSS;

return fsp.readFile(path.join('.', 'templates', 'body.html'), { encoding: 'utf-8' })
.then((content) => {
var pendingWrites = [];

for (let i = startAt, endAt = startAt + pages; i < endAt; i++) {
let filename = path.join('.', 'manuscript', `page-${i}`, `style.${cssExt}`);
let thisWrite = fsp.writeFile(filename, '');

pendingWrites.push(thisWrite);
}

return Promise.all(pendingWrites);
})
.catch((err) => {
// either fully recover from the error or rethrow
console.log("Could not add pages: ", err);
throw err;
});
}

正如评论中所阐述的,抵制在您的 Promise 链中引入非功能性 .catch() 处理程序的诱惑。

在这种情况下,非功能性意味着:它不会从错误中恢复并且不会重新抛出错误。不抛出异常的 catch 处理程序将错误标记为已处理,即它返回已解决的 promise ,而不是已拒绝的 promise 。这使得稍后在 promise 链中进行正确的错误处理变得不可能。这是不好的做法,而且没有帮助。

如果您想记录错误,请记录它并重新抛出它。如果您已完全从错误中恢复并且后续代码畅通无阻,请不要重新抛出。

关于node.js - Promise.then() 中的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572767/

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