2017-07-02 25 views
0

這是一個完整的nodejs初學者,學習異步編程 - 尤其是承諾。但我完全困惑於如何將像for-loop這樣的同步操作「轉換」爲異步調用。在節點中以異步方式調用函數

var loopfunction = function(version:string) : void { 
    console.log("Begin" + version + " Loop") 
    for (let i = 0; i <= 10; i++) { 
     console.log(version + "Number looping through is " + i) 
    } 
    console.log("End Loop") 
} 

console.log("Calling sync function") 
loopfunction("First : "); 
loopfunction("Second : "); 
loopfunction("Third : "); 
console.log("ending sync function") 

在上面的代碼中,'loopfunction'調用是同步執行的。執行「第一次」呼叫,然後是第二次,然後是第三次。

如何編寫異步函數/代碼以異步方式執行相同的loopfunction調用?即。第二個和第三個loopfunction調用不會等待先前的loopfunction調用完成並同時運行。

非常感謝

+0

試試這個https://caolan.github.io/async/ – Taki

+0

什麼是你的實際目標這裏?你不能實際上使一組同步的代碼異步運行。 node.js中的異步代碼使用本機代碼在後臺完成實際操作,然後使用回調通知告訴您何時完成。您可以更改同步代碼的時間(運行在下一個時間點或某個計時器觸發後),但它不會實際異步運行。每當它運行時,它仍然是同步的。 – jfriend00

+0

非常感謝,這回答了我的問題:) – Sibi

回答

0

如果你想有一個純粹的異步調用那麼它可能看起來像:

var loopfunction = function(version:string) : void { 
    setTimeout(function(){ 
     console.log("Begin" + version + " Loop") 
     for (let i = 0; i <= 10; i++) { 
     console.log(version + "Number looping through is " + i) 
     } 
     console.log("End Loop") 
    }, 0); 
} 

console.log("Calling sync function") 
loopfunction("First : "); 
loopfunction("Second : "); 
loopfunction("Third : "); 
console.log("ending sync function") 

如果你正在考慮創建並返回一個承諾:

var loopfunction = function(version:string) { 
    return new Promise(function(resolve){ 
     console.log("Begin" + version + " Loop") 
     for (let i = 0; i <= 10; i++) { 
     console.log(version + "Number looping through is " + i) 
     } 
     console.log("End Loop") 
     resolve(); 
    }); 
} 

console.log("Calling sync function") 
loopfunction("First : "); 
loopfunction("Second : "); 
loopfunction("Third : "); 
console.log("ending sync function") 

然而,在這種情況下,你並沒有等待承諾。如果你要等待(所以在「同步」執行承諾的方式),那麼:

var loopfunction = function(version:string) { 
    return new Promise(function(resolve){ 
     console.log("Begin" + version + " Loop") 
     for (let i = 0; i <= 10; i++) { 
     console.log(version + "Number looping through is " + i) 
     } 
     console.log("End Loop") 
     resolve(); 
    }); 
} 

console.log("Calling sync function") 
loopfunction("First : ").then(function(){ 
    return loopfunction("Second : "); 
}). then(function(){ 
    return loopfunction("Third : "); 
}). then(function(){ 
    console.log("ending sync function") 
}); 

UPDATE

如果你想看到不同的順序結果,那麼你可以試試這個:

var loopfunction = function(version:string) { 
    return new Promise(function(resolve) { 
     //wait for some random time before executing the code 
     setTimeout(function(){ 
     console.log("Begin" + version + " Loop") 
     for (let i = 0; i <= 10; i++) { 
      console.log(version + "Number looping through is " + i) 
     } 
     console.log("End Loop") 
     resolve(); 
     }, Math.floor((Math.random() * 1000) + 1)); 
    }); 
} 
+0

非常感謝。我嘗試運行第二個代碼塊「創建並返回承諾」,因爲這是我正在學習的內容。然而,輸出仍然是 - 第一個循環開始和結束,然後第二個循環開始和結束,然後是第三個。我正在尋找的東西就像快速射擊,kickstart第一個loopfunction,讓它運行,並在運行時,啓動第二個和第三個loopfunction。我試圖得到的輸出是從三個不同的loopfunctions console.log輸出沒有按順序和混亂的地方 - 如果有意義的話,運行多個併發線程 – Sibi

+0

@Sibi我更新了我的答案與應該做什麼的代碼你正在尋找 – gawi

0

如果你希望你的長期運行的代碼不會阻止只是將其更改爲

var loopfunction = function(version:string) : void { 
    console.log("Begin" + version + " Loop") 
    for (let i = 0; i <= 10; i++) { 
     setImmediate(function() { 
      console.log(version + "Number looping through is " + i) 
     }) 
    } 
    console.log("End Loop") 
} 

如果你想它也返回一個結果,或者當它完成知道,包裹承諾中的代碼:

var loopfunction = function(version:string) : void { 
    console.log("Begin" + version + " Loop") 
    var iterations = [] 
    for (let i = 0; i <= 10; i++) { 
     iterations.push(new Promise(function(resolve) { 
      setImmediate(function() { 
       console.log(version + "Number looping through is " + i) 
       resolve() 
      }) 
     })) 
    } 
    return Promise.all(iterations).then(function() { 
     console.log("End Loop") 
    }) 
}