2013-11-26 42 views
2

我希望能夠將自己可能包含鏈接方法的方法鏈接在一起。我如何鏈接Q嵌套承諾?我無法讓它們以正確的順序運行

日誌應爲「第一,第二,第三」。然而,實際上它出現了「第二,第三,第一」。

我知道這段代碼有點多餘,但我只是想了解promises/node如何執行。我會如何編寫基於承諾的函數,這些函數可以鏈接在一起?

user.increaseReadings(id) 
     .then(function(val) { console.log("second",val); return user.findById(id); }) 
     .then(function(val) { console.log("third",val); res.json(val); }); 
    } 

/models/user模塊:

exports.findById = findById; 
function findById(id) { 
    deferred = Q.defer(); 

    User.findById(id, function(err, doc) { 
    if (err) return deferred.reject(err); 
    deferred.resolve(doc); 
    }); 

    return deferred.promise; 
} 

exports.increaseReadings = increaseReadings; 
function increaseReadings(id) { 
    deferred = Q.defer(); 

    findById(id).then(function(doc) {  <-- here's the problem 
    doc.readings++; 
    doc.save(function(err, doc) { 
     console.log("first"); 
     if (err) return deferred.reject(err); 
     deferred.resolve(doc); 
    }); 
    }); 

    return deferred.promise; 
} 

回答

2

你可以重寫你的increaseReadings這樣:

function increaseReadings(id) { 
    return findById(id).then(function(doc) { 
     console.log(doc); 
     var deferred = Q.defer(); 
     doc.readings++; 
     doc.save(function(err, doc) { 
      console.log("first"); 
      if (err) return deferred.reject(err); 
      deferred.resolve(doc); 
     }); 
     return deferred.promise; 
    }); 
} 

這個代碼,你寫了一個的重要區別是匿名函數傳遞到'然後'方法返回一個承諾。

在大多數承諾實現中,如果您作爲處理程序的結果返回承諾,那麼在解決您返回的承諾之前,鏈中的下一步將不會執行。

+0

有道理。謝謝。 –