异步/等待如何工作,为什么它在这里不起作用

时间:2019-01-04 12:12:53

标签: javascript node.js

我一直试图了解异步/等待的工作原理,我要做的就是让它等待直到返回值。但是,我无法通过回调,promise或async/await做到这一点。我在做什么错,为什么async/await不能正常工作? (等待运行其他代码,直到实现此承诺为止)

像这样的许多问题都链接到“简介页面”。我已经阅读了所有内容,了解了它们的功能,只是不知道如何正确地将它们写出,因为我相信我做的一切正确,我只是缺少了一些东西 console.log("xcdcxcxcxccxvccvffdgfcd");

thing();
async function thing() {
    let c = await otherthing();
    console.log("dfasfadsfdasasdfa" + c)
}

async function otherthing() {
    await setTimeout(function() {
        return new Promise((resolve, reject) => {
            let f = "rerewwqfewfasgsadf"
            return resolve(f);
        })
    }, 3000);
}

console.log应该等待,直到返回承诺值c,但是,它似乎不起作用。为什么?

4 个答案:

答案 0 :(得分:4)

异步/等待与返回承诺的函数一起使用。您的otherthing函数不会返回任何内容。

您可以通过返回实例化的Promise来修复代码,如下所示:

    thing();

    async function thing() {
        let c = await otherthing();
        console.log("dfasfadsfdasasdfa" + c)
    }

    function otherthing() {
        return new Promise((resolve, reject) => {
            setTimeout(function () {
                let f = "rerewwqfewfasgsadf"
                resolve(f);
            }, 3000)
        });
    }

答案 1 :(得分:3)

您必须从return函数而不是new Promise回调中otherthing setTimeout。您应该构造承诺,在其执行程序回调中启动异步操作(setTimeout),然后异步resolve()reject()承诺。

function otherthing() {
  return new Promise((resolve, reject) => {
    setTimeout(function(){
      let f = "rerewwqfewfasgsadf"
      resolve(f);
    }, 3000);
  });
}

对于该函数,您实际上不需要任何async / await,而该函数实际上只是setTimeout周围的一个承诺包装。另请参见How do I convert an existing callback API to promises?

答案 2 :(得分:2)

您应该将setTimeout移到Promise内,然后resolve(f)

function otherthing() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            let f = "rerewwqfewfasgsadf"
            resolve(f);
         }, 3000);
    });
}

答案 3 :(得分:0)

async function otherthing没有return语句,因此它将始终返回解析为undefined的Promise。

await setTimeout(...)没有任何意义。您只能await个承诺,setTimeout不返回承诺。


您需要明确:

  • new Promise()内创建一个otherthing
  • resolve()在传递给setTimeout的回调函数中具有所需的值
  • return来自otherthing的承诺

不要在传递给setTimeout的回调函数中创建Promise。那里没有意义。