javascript - promise 在解决时抛出未处理的错误

标签 javascript node.js promise bluebird

我有下面的代码,但是当 resolve 被调用时它会抛出:

Possibly unhandled Error: undefined
    at Promise$_rejecter (c:\projects\Test\promiseftp\node_modules\bluebird\js\main\promise.js:602:58)
    at WriteStream.<anonymous> (c:\projects\Test\promiseftp\index.js:45:33)
    at WriteStream.EventEmitter.emit (events.js:117:20)
    at fs.js:1598:14
    at Object.oncomplete (fs.js:107:15)

代码如下:

var Client = require('ftp');
var path = require('path');
var fs = require('fs');
var Promise = require('bluebird');


var c = new Client();

var connectionProperties = {
    host: "myhost",
    user: "myuser",
    password: "mypwd"
};

c.connect(connectionProperties);

var downloadFiles = new Promise.method(function () {
    return new Promise(function (reject, resolve) {
        c.on('ready', function () {
            c.list(function (err, list) {
                if (err) reject(err);
                list.forEach(function (element, index, array) {
                    //Ignore directories
                    if (element.type === 'd') {
                        console.log('ignoring directory ' + element.name);
                        return;
                    }
                    //Ignore non zips
                    if (path.extname(element.name) !== '.zip') {
                        console.log('ignoring file ' + element.name);
                        return;
                    }

                    c.get(element.name, function (err, stream) {
                        if (err) reject(err);
                        console.log(element.name);
                        stream.once('close', function () {
                            //c.end();
                            //resolve();
                        });

                        var pipeaction = stream.pipe(fs.createWriteStream(element.name));
                        pipeaction.on('close', function () {
                            console.log('close');
                            //THROWS HERE!
                            resolve();
                        });

                    });
                });
            });
        });
    });

});


downloadFiles().then(function () {
    console.log('woot');
});

有什么想法吗?

最佳答案

请不要混用回调和 promise ,看看它有多简单:

when(c, "ready").then(function(){
    return c.listAsync();
}).filter(function(element) {
    return element.type !== "d" && path.extname(element.name) === ".zip";
}).map(function(element) {
    return c.getAsync(element.name).then(function(stream) {
        return when(stream.pipe(fs.createWriteStream(element.name)), "close");
    })
}).then(function(){
    console.log("all files copied");
});

样板文件:

var path = require('path');
var fs = require('fs');
var Promise = require('bluebird');
var Client = require('ftp');
Promise.promisifyAll(Client.prototype);

var c = new Client();

var connectionProperties = {
    host: "myhost",
    user: "myuser",
    password: "mypwd"
};

c.connect(connectionProperties);

function when(obj, event) {
    return new Promise(function(resolve) {
        obj.on(event, resolve);
    });
}

关于javascript - promise 在解决时抛出未处理的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22546933/

相关文章:

javascript - 占位符不显示

javascript - 如何在 Drupal 中获取内容类型字段的值并将其传递给 JS 文件

node.js - 使用 git push 在 nodejs 包中自动增加应用程序版本

javascript - 为什么 node.js 会忽略 package.json 文件中的 "type"设置?

node.js - 使用 Mongoose 查找过去 7 天内的注册用户总数

javascript - 异步/顺序 promise ,检测结束

javascript - 如何识别html页面中的所有元素都已经渲染完毕?

javascript正则表达式 - 字符串中任意位置的有效字符和组

javascript - 收集在 forEach 的 promises 中生成的 promises

javascript - Chrome Extensions 同步调用 - 仅在窗口关闭后创建窗口