Bluebird.js承诺没有链接.then()s

时间:2016-06-18 01:33:26

标签: javascript socket.io promise bluebird

socket.on('new video', function(data) {
    console.log("New video")
    var addToCueP = Promise.promisify(addToCue)
    var getCueFromDbP = Promise.promisify(getCueFromDb)

    addToCueP(data.id, socket.nickname)
    .then(function() {
        return getCueFromDbP();
    })
    .then(function() {
        console.log("Emit change video")
        io.sockets.emit('change video', {id: data.id, title: data.title, nick: socket.nickname});
    })          
});

我正在使用Bluebird作为承诺,但是我遇到了问题,addToCue函数被调用但是其他函数在例如getCuefromDb和Socket发射器之后没有被触发,是否有人知道我在哪里'我错了?

addToCue()

var addToCue = function(id, user) {
console.log("Add to cue")
var video = new Video();
video.id = id;
video.user = user;
video.save(function(err, data) {
    if (err) {
        console.log(err)
    } else {
        return true
    }
});
}

getCueFromDb()

var getCueFromDb = function(callback) {
Video.find({}).exec(function(err, videos) {
        if (err) {
            return err;
        }
        if (videos.length) {
            cue = []; // empty array
            videos.forEach(function(video) {
                cue.push(video.id) // push all the videos from db into cue array
            });
            io.sockets.emit('send cue', {cue: cue});
            console.log("getCueFromDb", cue)
            if (callback) {
                callback();
                return
            }
            else {
                return
            }
        }
        else {
            cue = [];
            io.sockets.emit('send cue', {cue: cue});
            console.log("getCueFromDb (no videos)", cue)
            if (callback)
                callback()
            else
                return
        }
})
}

1 个答案:

答案 0 :(得分:0)

addToCue()不接受正确类型的参数以便在其上调用.promisify() - 因此promisify无法正常使用它。

addToCue()的最后一个参数必须是异步操作完成时调用的回调,并且该回调的第一个参数必须是错误值,第二个参数可以是结果。

现在,由于您将代码控制为addToCue(),因此您应该更改其代码以返回基于底层异步操作解析/拒绝的承诺,而不是使用.promisify()。< / p>

var addToCue = function(id, user) {
    return new Promise(function(resolve, reject) {
        console.log("Add to cue")
        var video = new Video();
        video.id = id;
        video.user = user;
        video.save(function(err, data) {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
}

或者,您可以在视频对象的.promisify()video.save()上使用.promisifyAll()

或者,如果您的视频界面已经支持承诺,您可以使用它的本机支持并返回该承诺。

相关问题