我有以下代码使用在技术上可以工作的 await 模块(我认为)。
var await = require('await')
var sleep = require('sleep')
var things = await('one', 'two');
function getData(key){
console.log("IN FUNCTION " + key);
sleep.sleep(5);
var data = "got data for " + key;
things.keep(key, data);
console.log("DONE WIH FUNCTION " + key);
}
console.log("start");
getData('one');
getData('two');
console.log('end');
things.then(function(got){
console.log(got.one);
console.log(got.two);
}
);
输出为:
start
IN FUNCTION one
DONE WIH FUNCTION one
IN FUNCTION two
DONE WIH FUNCTION two
end
got data for one
got data for two
一切似乎都得到了传递,因为它应该履行承诺。但是,它看起来是同步执行的,而不是异步执行的。我本来希望看到:
start
IN FUNCTION one
IN FUNCTION two
DONE WIH FUNCTION one
DONE WIH FUNCTION two
end
got data for one
got data for two
它也需要大约 10 秒,而大麦应该只需要 5 秒以上。
睡眠是阻塞的,并且没有将控制权返回给事件循环,因此您的代码只是在它说睡眠的地方休眠。
如果将其转换为异步,则setTimeout
如下所示:
function getData(key){
console.log("IN FUNCTION " + key);
setTimeout(function() {
var data = "got data for " + key;
things.keep(key, data);
console.log("DONE WIH FUNCTION " + key);
}, 5000);
}
我得到这个输出:
start
IN FUNCTION one
IN FUNCTION two
end
DONE WIH FUNCTION one
got data for one
got data for two
DONE WIH FUNCTION two
这对我来说是正确的。