2017-07-02 56 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") 
    }) 
}