promise.then() 中的循环?
For loop in promise.then()?
我需要在每次迭代时在两个值和 create/touch 个文件 (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()
范围内循环的方法,但问题是 why/how?
我无法理解为什么 for-loop
在上下文移出承诺的 then() 范围之前不执行,然后我应该如何获得预期的结果。
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;
});
}
如评论中所述,抵制将 none 函数式 .catch()
处理程序引入您的承诺链的诱惑。
在这种情况下,非功能性意味着:它不会从错误中恢复并且不会重新抛出错误。不抛出的 catch 处理程序将错误标记为已处理,即它 returns 已解决的承诺,而不是被拒绝的承诺。这使得稍后在承诺链中进行正确的错误处理变得不可能。这是不好的做法,没有帮助。
如果要记录错误,请记录并重新抛出。如果你已经完全从错误中恢复过来,并且后续代码畅通无阻,请不要重新抛出。
我需要在每次迭代时在两个值和 create/touch 个文件 (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()
范围内循环的方法,但问题是 why/how?
我无法理解为什么 for-loop
在上下文移出承诺的 then() 范围之前不执行,然后我应该如何获得预期的结果。
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;
});
}
如评论中所述,抵制将 none 函数式 .catch()
处理程序引入您的承诺链的诱惑。
在这种情况下,非功能性意味着:它不会从错误中恢复并且不会重新抛出错误。不抛出的 catch 处理程序将错误标记为已处理,即它 returns 已解决的承诺,而不是被拒绝的承诺。这使得稍后在承诺链中进行正确的错误处理变得不可能。这是不好的做法,没有帮助。
如果要记录错误,请记录并重新抛出。如果你已经完全从错误中恢复过来,并且后续代码畅通无阻,请不要重新抛出。