2015-12-08 141 views
-1

我想使用節點承諾創建一個同步調用的序列,以便可以返回給調用者的結果。節點承諾沒有同步執行

我的代碼如下所示。

console.log("Call Outer HubTest"); 
var outerConnection; 
var ret = mysql.createConnection({ 
    host  : 'localhost', 
    port  : '3306', 
    user  : 'MyUser', 
    password : 'MyPwd', 
    database : 'MyDb' 
}).then(function (conn) { 
    console.log("OuterhubTest: Set Connection to "+conn); 
    outerConnection = conn; 
}).then(function (result) { 
    console.log("OuterhubTest: Connection is"+outerConnection); 
    return outerConnection.query("SELECT 1"); 
}).then(function (rows) { 
    console.log("OuterhubTest: Rows of length "+rows.length); 
}).catch(function (err) { console.log("Error was "+err)}) 
console.log("After OuterhubTest"); 

我的跡線意味着鏈正在異步調用: -

Call Outer HubTest 
After OuterhubTest 
OuterhubTest: Set Connection to [object Object] 
OuterhubTest: Connection is[object Object] 
OuterhubTest: Rows of length 1 

如果這是同步的,我本來期望一直都OuterhubTest跟蹤「後OuterhubTest」之前。我不確定我做錯了什麼。 在此先感謝

+6

承諾不會使異步代碼同步。 – robertklep

+1

承諾本質上是異步的。 –

回答

0

承諾並不神奇。除了常規JavaScript可能會做的事之外,他們不會做任何事情。

承諾只會同步裏面的承諾鏈,就像您在示例中看到的那樣。事實上 - 承諾保證在這樣的場景:

log(1); 
promise.then(() => log(2)); 
log(3); 

的順序永遠是1,3,2 - 這是爲了避免Zalgo