Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的异步赢了';Don’不要停下来等待我的等待——等待在等待什么呢?_Javascript_Node.js_Asynchronous_Async Await - Fatal编程技术网

Javascript 我的异步赢了';Don’不要停下来等待我的等待——等待在等待什么呢?

Javascript 我的异步赢了';Don’不要停下来等待我的等待——等待在等待什么呢?,javascript,node.js,asynchronous,async-await,Javascript,Node.js,Asynchronous,Async Await,我进入了Node,被扔进了异步编程的世界 我在Mozilla的网站上彻底阅读了这篇文章(以及许多其他关于async和Wait关键字的链接): 我有一个项目,我正在开始,将需要大量的数据库调用,一个接一个。有些查询将依赖于前一个查询的结果。话虽如此,我决定更好地练习并编写一些测试代码 以下是我的测试代码: var users, items; const getData = async function(){ // This is a DB call. Will take //

我进入了Node,被扔进了异步编程的世界

我在Mozilla的网站上彻底阅读了这篇文章(以及许多其他关于async和Wait关键字的链接):

我有一个项目,我正在开始,将需要大量的数据库调用,一个接一个。有些查询将依赖于前一个查询的结果。话虽如此,我决定更好地练习并编写一些测试代码

以下是我的测试代码:

var users, items;

const getData = async function(){
    // This is a DB call. Will take
    // a little bit of time to complete.

    setTimeout(() => {
        var queryResults = "A list of items";
        items = queryResults;
    }, 1000);

    return items;
}

const getUsers = async function(){
    setTimeout(() => {
        var queryResults = "A list of items";
        users = queryResults;
    }, 1000);

    return users;
}

const init = async function(){
    var itemSuccess = await getData();
    var userSuccess = await getUsers();

    console.log(`Here is your items: ${items}, and here are your users: ${users}`);
}

init();
我的代码失败,原因是:

Here is your items: undefined, and here are your users: undefined
所以我自然而然地回到了Mozilla。我重新阅读了文档,并尝试了一些更改。但仍然没有成功。最终,我回到了上面的原始代码

我看不出为什么这会失败。我使用超时来模拟查询所需的时间。如果async按照它所说的做了,两个函数都应该返回它们的值,然后我的控制台日志应该打印出正确的结果

有人知道我哪里出错了吗


谢谢。

向我们展示包含实际数据库调用的真实代码,我们可以更具体地帮助您,包括向您展示工作代码。请抵制用伪代码发布问题的诱惑。展示真实的代码,如果您向我们展示真实的代码,我们可以更快更好地帮助您

await
仅在您
await
时才做有用的事情当您感兴趣的事情完成或出现错误时,承诺会解决或拒绝

它并没有神奇的魔力,不知何故,它可以知道a
setTimeout()
或任何其他异步操作何时完成

因此,当您这样做时:

var itemSuccess = await getData();
而且,
getData()
看起来像这样:

const getData = async function(){
    // This is a DB call. Will take
    // a little bit of time to complete.

    setTimeout(() => {
        var queryResults = "A list of items";
        items = queryResults;
    }, 1000);

    return items;
}
你最后要做的就是:

var itemSuccess = await undefined 
因为您的
getData()
函数不返回承诺,事实上,它甚至不返回项目,因为它在计时器之前返回,所以
items
(此处似乎没有正确声明)尚未收到其值

因此,我建议您从基础开始,阅读
await
真正做的事情。确保您了解它如何与承诺交互,因为它仅在与承诺一起使用时才有用。然后,学习如何使异步操作在异步操作完成时返回连接到的承诺。然后,也只有到那时,您才能正确使用
wait

在一个组织良好的世界中,您可以确保所有异步操作都已返回,然后可以
async/wait
.then()
.catch()
来控制所有异步操作的流程。在许多情况下,这涉及到学习您正在使用的任何东西的promise接口。例如,现代版本的node.js在
fs.promises
中为文件系统提供了一个完整的promise接口

在少数情况下,您正在使用的某些库可能不存在promise接口,您可能需要将异步操作包装在promise中以创建自己的promise接口
util.promisify()
内置于node.js中,以帮助您完成这一任务

如果您显示实际的代码,包括您正在使用的数据库和您试图进行的实际数据库调用,那么这里的某人可能会帮助您正确使用数据库上的promise接口。这个伪代码阻止我们专门帮助您。如果没有您的实际代码,并且不知道您在特定数据库中进行的实际DB调用,我们很难给出更多建议,只需使用promise接口访问您的数据库并学习如何正确使用这些承诺。很乐意提供更具体的帮助,但我们需要看到您真正的代码来实现这一点


最后,在Javascript中,如果您在任何异步回调中为更高范围内的某个对象赋值,则有99.99%的可能性您做错了事情。您可以实际使用该值的唯一位置是回调本身内部或从那里调用并将该值传递给的函数中。因此,当您执行
items=queryResults
,其中
items
在您上方的几个作用域中声明时,应该会发出警报,提示这对您不起作用。这不是您如何使用Javascript中的异步代码编程,不仅仅是因为样式原因,而是因为它不起作用。

使用:

function timeout(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
而不是

setTimeout(() => {
}, 1000);

wait
等待
承诺
解决

//返回承诺的普通函数
const getData=函数(){
//这是一个数据库呼叫。将占用
//需要一点时间来完成。
返回新承诺(解决=>{
设置超时(()=>{
var queryResults=“数据列表”;
解决(查询结果);
}, 1000);
});
}
const getUsers=函数(){
返回新承诺(解决=>{
设置超时(()=>{
var queryResults=“用户列表”;
解决(查询结果);
}, 1000);
});
}
const init=异步函数(){
var itemSuccess=wait getData();
var userSuccess=await getUsers();
log(`这是您的项:${itemsucture},这是您的用户:${userSuccess}`);
}

init()您不是在等待承诺。
async
关键字无法自动将回调转换为承诺。你需要从一个承诺开始。
async
关键字所做的就是允许您在其内部使用
wait
。这是它唯一的功能。如果您没有使用
wait
关键字,您就不需要
async
关键字,因此
getData
getUsers
中的
async
完全没有用,什么也不做。也许值得演示如何使用
new Promise()
包装
setTimeout
。我知道这是显而易见的,但如果有人需要问这个问题,很可能不是