Javascript异步功能正在等待响应而没有等待

时间:2018-10-07 11:18:15

标签: node.js asynchronous async-await

我是JavaScript异步行为概念的新手。

以下代码使我感到困惑。根据我的概念,b应该在wait函数完成执行之前返回,因为我没有告诉它使用'await'等待。 但是我得到的输出是这样的: 之前 然后等待6秒 后 在b

之后

预期输出: 之前 后 b之后 无需等待6秒钟 这是代码:

function wait(ms)
{

  var start = new Date().getTime();

  var end = start;

  while(end < start + ms) {    

    end = new Date().getTime();

    }
}

async function b () {
  console.log('before');
  wait(6000);
  console.log('after');
}

async function c () {
b()
console.log('after b');
}

c();

请帮助我更好地理解这个概念

2 个答案:

答案 0 :(得分:2)

这很容易理解。函数wait()是同步的。

async关键字不会使函数异步。它仅允许您在标有await的函数中使用async关键字。


那么您怎么知道一个函数是否异步同步呢?最简单的方法是阅读文档。

Javascript几乎没有任何功能可以向您发出信号,无论该功能是同步的还是异步的。甚至回调的存在都不是信号。例如,Array.prototype.sort()接受回调,但完全同步。 async关键字是朝正确方向迈出的良好一步,可以预示一个函数是异步的,但是正如您自己所展示的那样,关键字取决于函数的作者了解async关键字的作用。

好处是,与其他语言(例如Java或C ++)不同,JavaScript中的文档往往非常出色,因为通常没有自动文档(即使您在js中使用自动文档系统,也需要手动为其编写注释)。在README文件中编写详细,清晰的文档是一种普遍的文化,以便npm为图书馆的用户选择。


那么如何在javascript中编写一个异步函数呢?

通常只有两种方法可以做到:

  1. 使用异步功能。例如setTimeout()fetch()

    function waitOneSecond () {
        return new Promise(functionn (ok,err) {
            setTimeout(ok,1000);
        });
    }
    
  2. 用C编写。对于node.js,您可以使用Addons API在C / C ++(https://nodejs.org/api/addons.html)中实现模块,Chrome具有NaCl(https://developer.chrome.com/native-client)等。已实现setTimeout()fetch()等功能。

答案 1 :(得分:1)

请参见以下示例:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

如前所述,async关键字允许您使用await。从技术上讲,它还有更多功能,但是现在让我们省略。

该示例显示了Promise(确实允许异步编程),async函数await在对其进行解析之前要对其进行解析。基本上,await允许您在处理异步函数时编写同步代码。

尝试使用示例(例如,删除等待)。这将导致代码不等待promise并返回promise,而不是promise的resolve值。

如果您想涉足异步编程,那么最好的选择就是涉足Promise个。这些为您提供了这样做的界面。

这个概念很简单。您要做一些工作,并在完成时调用回调(成功时解决,失败时拒绝)。了解界面可能会有些困难,但是MDN拥有丰富的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise