2016-06-18 59 views
-1
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}); 
    })   
}); 

我使用藍鳥的承諾,但我有問題,該addToCue函數被調用,但其他功能後,例如getCuefromDb和插座發射器的心不是讓觸發,有沒有人有任何想法我要去哪裏錯了?Bluebird.js無極不是鏈接。那麼()■

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

'addToCue()'和'getCueFromDb()'的簽名是什麼?如果你已經在使用Promises,爲什麼你必須提供這些功能?他們爲什麼不回諾言? – Thomas

+0

他們只是正常的功能,但我希望他們按此順序執行我認爲這是正確的方式去了解它而不是回調我錯了嗎? – julianmp

+2

你沒有處理錯誤,從你描述的一個可能的情況是'addToCueP'拋出或拒絕有錯誤 – Srle

回答

0

addToCue()不接受正確類型的參數,以呼籲IT- .promisify()因此promisify不起作用正確使用它。

addToCue()的最後一個參數務必是當異步操作完成時調用的回調,並且該回調的第一個參數必須是錯誤值,第二個參數可以是結果。

現在,由於您將代碼控制爲addToCue(),因此您應該更改其代碼以返回基於底層異步操作解決/拒絕的承諾,而根本不使用.promisify()

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); 
      } 
     }); 
    }); 
} 

或者,你可以在視頻對象上video.save().promisifyAll()使用.promisify()。或者,如果您的視頻界面已經支持諾言,您可以使用它的本地支持並返回該諾言。