2015-12-08 94 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