我需要在JavaScript中编写一个函数,它从调用异步函数返回一个状态.但是,调用者只接收该值,并且不提供回调函数.我尝试过类似的东西:
function getState() {
var ret = null;
asyncCall("request",
function() { ret = "foo"; } // callback
);
while (ret === null)
; // block on the asynchronous call
return ret;
}
Run Code Online (Sandbox Code Playgroud)
然而,循环永远不会结束......
有任何想法吗?谢谢.
首先,我熟悉异步/同步功能的概念。还有很多与我有关的问题。但是我在任何地方都找不到答案。
所以问题是: 有没有一种方法可以使用async / await返回值而不是Promise?作为同步功能。
例如:
async doStuff(param) {
return await new Promise((resolve, reject) => {
setTimeout(() => {
console.log('doStuff after a while.');
resolve('mystuffisdone'+param);
}, 2000);
});
}
console.log(doStuff('1'));
Run Code Online (Sandbox Code Playgroud)
获取此函数值的唯一方法是使用该.then
函数。
doStuff('1').then(response => {
console.log(response); // output: mystuffisdone1
doOtherStuffWithMyResponse(response);
// ...
});
Run Code Online (Sandbox Code Playgroud)
现在,我想要的是:
const one = doStuff('1');
console.log(one) // mystuffisdone1
const two = doStuff('2');
console.log(two) // mystuffisdone2
Run Code Online (Sandbox Code Playgroud)
为了说明我自己,我有一个充满回调的异步库。我可以通过使用Promises和async / await来伪造同步行为,从而将该异步行为转换为同步行为。但是仍然存在一个问题,它最终还是异步的。超出异步功能范围。
doStuff('1').then((r) => {console.log(r)};
console.log('Hello wolrd');
Run Code Online (Sandbox Code Playgroud)
结果为:Hello world
then mystuffisdone1
。这是使用异步/等待功能时的预期行为。但这不是我想要的。
现在我的问题是:没有关键字async,有没有办法做与await一样的事情?使代码同步?如果不可能,为什么?
编辑:
谢谢您提供的所有答案,我想我的问题并不是所有问题都显而易见。为了澄清我的想法,这是我对@Nikita Isaev答案的评论。
“我理解为什么所有I / O操作都是异步完成;还是并行完成。但是我的问题更多的是,为什么引擎不以异步方式阻止同步函数的调用者?我的意思 …
我想在 node.js 中编写一个小型工作应用程序。
该应用程序将从 AWS-SQS 读取数据,以某种方式处理数据,然后将其输出到另一个 AWS-SQS。
到目前为止,我已经写了:
while(true){
readFromQueue()
.then(transform)
.then(writeToQueue);
}
function transform(data) {
console.log("> transforming...");
//transformation logic
return data;
}
//TODO: need to remove message from queue after read!
function readFromQueue() {
// var params = {
// QueueUrl: 'STRING_VALUE',
// WaitTimeSeconds: 2
// };
// return new Promise(function(resolve, reject) {
// sqs.receiveMessage(params, function(err, data) {
// if (err) reject(err);
// else resolve(data);
// });
// });
return new Promise(function(resolve, reject) {
console.log("> reading from queue...");
resolve({ …
Run Code Online (Sandbox Code Playgroud)