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
}
})
}
答案 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()
。
或者,如果您的视频界面已经支持承诺,您可以使用它的本机支持并返回该承诺。