我无法让 Promise 按预期工作。我需要做以下事情:
我从 stdout 获取文件名,将它们拆分成行并复制它们。复制操作完成后,我想开始其他操作,这是我的问题。
我在 Promise 中创建了一个复制函数,如果出现错误,我会立即拒绝它,如果没有错误,我会在循环复制完成后解决它,但由于某种原因,then() 中的函数在复制操作之前执行完成
var lines = stdout.split(/\r?\n/);
copyUpdatedFiles(lines).then(
function() {
console.log('this one should be executed after copy operation');
}
);
function copyUpdatedFiles(lines) {
return new Promise(function(resolve, reject) {
for (var i = 0; i < linesLength; i++) {
fs.copy(lines[i], target, function(err) {
if (err) {
reject();
}
});
}
resolve();
});
}
请帮忙,因为我显然遗漏了一些东西。
最佳答案
一旦您调用 resolve
,它就会得到解决,这是您在开始副本之后但在它们完成之前所做的。在你resolve
之前你必须等待最后一个回调。这意味着跟踪您看到了多少,请参阅 ***
评论:
function copyUpdatedFiles(lines) {
return new Promise(function(resolve, reject) {
var callbacks = 0; // ***
for (var i = 0; i < linesLength; i++) {
fs.copy(lines[i], target, function(err) {
if (err) {
reject();
} else { // ***
if (++callbacks == lines.length) { // ***
resolve(); // ***
} // ***
} // ***
});
}
});
}
或者,有几个库可以对 NodeJS 风格的回调进行 promise-ify,因此您可以使用标准的 promise 组合技术,例如 Promise.all
。如果您正在使用其中之一,您只需做一些事情:
function copyUpdatedFiles(lines) {
return Promise.all(
// CONCEPTUAL, semantics will depend on the promise wrapper lib
lines.map(line => thePromiseWrapper(fs.copy, line, target))
);
}
旁注:您的循环条件引用了一个变量 linesLength
,它没有在您的代码中的任何地方定义。它应该是 lines.length
。
关于javascript - nodejs then() 函数在 promise 解析之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38397072/