Łuk*_*ona 4 javascript node.js promise
我在让 Promise 按预期工作时遇到问题。我需要做以下事情:
我从标准输出获取文件名,将它们分成行并复制它们。复制操作完成后,我想开始其他操作,这是我的问题。
我在 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();
});
}
Run Code Online (Sandbox Code Playgroud)
请帮忙,因为我显然错过了一些东西。
只要您拨打电话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(); // ***
} // ***
} // ***
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
或者,有一些库可以 Promise-ify NodeJS 风格的回调,因此您可以使用标准的 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))
);
}
Run Code Online (Sandbox Code Playgroud)
旁注:您的循环条件引用了linesLength代码中未定义的变量。它应该是lines.length。
| 归档时间: |
|
| 查看次数: |
4507 次 |
| 最近记录: |