相关疑难解决方法(0)

如何在JavaScript中阻止异步函数

我需要在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)

然而,循环永远不会结束......

有任何想法吗?谢谢.

javascript asynchronous

10
推荐指数
1
解决办法
2万
查看次数

有没有办法用async / await而不是Promise返回值?作为同步功能

首先,我熟悉异步/同步功能的概念。还有很多与我有关的问题。但是我在任何地方都找不到答案。

所以问题是: 有没有一种方法可以使用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 worldthen mystuffisdone1。这是使用异步/等待功能时的预期行为。但这不是我想要的。

现在我的问题是:没有关键字async,有没有办法做与await一样的事情?使代码同步?如果不可能,为什么?

编辑:

谢谢您提供的所有答案,我想我的问题并不是所有问题都显而易见。为了澄清我的想法,这是我对@Nikita Isaev答案的评论。

“我理解为什么所有I / O操作都是异步完成;还是并行完成。但是我的问题更多的是,为什么引擎不以异步方式阻止同步函数的调用者?我的意思 …

javascript asynchronous synchronous

5
推荐指数
1
解决办法
3260
查看次数

while(true) 循环中的承诺/等待承诺解决

我想在 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)

javascript amazon-web-services node.js promise

3
推荐指数
1
解决办法
3647
查看次数