2016-06-23 53 views
0

你好,這適用於第一次執行,但後來當我再試一次它似乎打破,沒有什麼似乎錯誤的諾言,這裏使用的方式可能無極問題

socket.on('new user', function(data, callback) { 
    return getUsersFromDb() 
    .then(function() { 
     if (users.name.indexOf(data) > -1) { 
      callback(false); 
      reject(err); 
     } 
     else { 
      callback(true); 
      // socket.nickname = data; 
      // people[socket.nickname] = socket; 
      updateNicknames(); 
      var user = new User(); 
      user.name = data; 
      user.save(function(err, data) { 
       if (err) { 
        console.log(err)  
       } 
       else { 
        return getUsersFromDb() 
        .then(function() { 
         updateNicknames() 
        }) 
        .catch(function(e) { 
         console.log("Error", e) 
        }) 
       } 
      }); 
      socket.broadcast.emit('user join', {nick: socket.nickname}); 
     } 
    }) 
    .catch(function(e) { 
     console.log("Error", e) 
    }) 
}); 

崇高似乎上色,然後與在第二個裏面抓住不同的方式,就好像它被錯誤地使用了一樣

+0

什麼是套接字變量?它是一個socket.io連接?或一個普通的套接字連接?另外,你爲什麼要叫'reject(err)'。 reject()定義在哪裏?而且,爲什麼你認爲''socket.on()'回調的第二個參數本身就是一個回調? 'updateNicknames()'做了什麼?你做什麼調試,當它不起作用?你知道它需要什麼代碼路徑嗎?你會得到什麼錯誤?這聽起來像你需要先進行元素調試,以便你可以確切地告訴我們代碼出錯的地方。 – jfriend00

+0

你的代碼真的需要重構,你會返回什麼?你應該通過一個承諾,然後如果你有多個異步調用,並鏈接起來 –

回答

-1

我假設以下函數返回一個promise!?

getUsersFromDb() 

你試過jQuery的承諾,使用$。當(functionWhichReturnsAPromise()),然後(下稱 「其餘代碼」)?

+0

首先,這是服務器端代碼(因此jQuery不是很合適)。其次,沒有理由使用'$ .when()'與單個承諾。你可以直接調用'.then()'在你已經擁有的承諾上。這似乎並沒有爲OP的問題提供任何答案。 – jfriend00