javascript - nodejs then() 函数在 promise 解析之前执行

标签 javascript node.js promise

我无法让 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/

相关文章:

javascript - 如果值为 0,如何隐藏 HTML 表格行

javascript - ScrollTop 到下一节,同时隐藏具有动画效果的上一节

node.js - React.semantic ui 图标未使用 webpack 中间件加载

javascript - 如何在promise链中调用Q promise notify

javascript - 使用 jquery 序列化无序列表

javascript - Asp .NET HiddenField 导致无效的回发或回调参数

node.js - 如何在 mongodb-memory-server 中设置初始数据?

node.js - Nginx 多个 Node JS Express 应用程序的多个位置

javascript - Angular - 检测两个订阅何时更新

javascript - Angular Controller 检查服务 promise 以更新 View