【问题标题】:async/await return Promise { <pending> } [duplicate]异步/等待返回 Promise { <pending> } [重复]
【发布时间】:2019-02-06 18:25:20
【问题描述】:

我的问题是:尽管我使用了 async/await,但为什么这个日志“promise {pending}”?我检查了类似的问题和答案,似乎应该没问题,但事实并非如此。我如何改变它以获得结果,为什么?谢谢。

const rp = require('request-promise-native');

async function sampleFunc() {
    let sample = await rp({
        uri: 'http://google.com',
        jar: true
    });
    return sample;
}

async function f() {
    return await sampleFunc();
}

console.log( f());

【问题讨论】:

  • 也许你想做的是打电话给await getLastPage();,然后再打电话给return
  • 在有这么多外部依赖项的情况下很难重现这一点。 uri 有什么价值? Cheerio 真的需要重现问题吗?还是整个搜索?如果无法访问您的计算机,我就无法真正运行您的代码,这使调试变得不必要地复杂。
  • @JörgWMittag 提出了一个很好的观点,Andrei - 你能写一个不考虑所有依赖关系的MCVE 吗?它会让你更容易帮助到你!
  • @JörgWMittag,URI 没问题,因为它工作正常,使用承诺链,而不是异步/等待。 URI是:“spb.hh.ru/search/vacancy?text=node.js&area=2&page=0”,我也在主帖里改了。
  • 1) 我并不是说这部分代码有问题。但它阻止我运行代码,这意味着我无法观察发生了什么并对其进行调试。 2)如果那部分代码没问题,那么它不可能与您的问题中的问题有任何关系,并且只是一个无用的分心,甚至不应该出现在问题中。

标签: javascript node.js async-await es6-promise


【解决方案1】:

async-await 实际上只是 Promise 的语法糖,它不会使异步代码同步运行(即它不会阻塞代码执行)。您的代码相当于以下内容:

function sampleFunc() {
    return new Promise(function(resolve) {
        rp({
            uri: 'http://google.com',
            jar: true
        }).then(function(sample) {
           resolve(sample);
        });
    });
}

function f() {
    return new Promise(function(resolve) {
        sampleFunc().then(function(result) {
            resolve(result);
        });
    });
}

console.log( f());

(是的,我知道上面的代码演示了一个反模式。这是为了说明目的)

如您所见,async 函数的真正作用是隐式返回一个承诺,该承诺将由您最终在函数内部返回的值解决(或者如果您 throw 某事被拒绝)。 这就是为什么async-await 只能用于函数,因此不适用于顶层。

调用该函数的上下文完全不知道该函数是async,它只是调用该函数,返回一个promise,然后继续下一行代码。你的 console.log() 生活在这个外部环境中,只看到返回的承诺。

【讨论】:

  • 一直听说await是阻塞的,但原来await只是阻塞了async函数内的代码执行……
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2018-11-17
  • 2020-03-04
  • 2021-03-17
  • 2019-12-08
  • 1970-01-01
  • 2020-07-09
  • 2017-10-16
相关资源
最近更新 更多