完成承诺后,为什么console.log是唯一的输出示例?

时间:2019-06-29 09:39:30

标签: javascript ajax asynchronous

这不是一个重复的问题,这是试图从How do I return the response from an asynchronous call?的详尽解释中获得非常具体的细节,但未涵盖。

我不太了解解决Promises的深刻答案。

我正试图了解如何从返回的Promise中解包我的数据。 console.log(data)没有回答问题。 “如何获得有效载荷?”。

为什么这是流血的秘密?

我使用节点REPL跟踪我的编码。除了最后一步,我在做所有正确的事情,而且我在这里陷入黑暗。

someasyncFunction()
.then(data => data);

应该返回“未包装的”有效载荷吗?那我为什么得到

$ node gettest.js 
Promise { <pending> }

我缺少一个技术性的文章,而我似乎无法得到任何答案。

const https = require('https');
const datastore = {};

async function getInfo (){
        https.get('https://www.gnu.org/software/bash/manual/html_node/Command-Line-Editing.html#Command-Line-Editing', (resp) => {
        let data='';

        resp.on('data', (chunk) => {
            data += chunk;
        });

        resp.on('end', () => {
            //console.log(data);
            return data;
                        });
        }).on("error", (err) => {
            console.log("Error: " + err.message);
        });
}

datastore.info = getInfo().then(function (val){
    return val;
});

console.log(datastore.info);

1 个答案:

答案 0 :(得分:0)

getInfo是一个Promise,方法then本身也会返回Promise。

您正在将变量分配给Promise,因此很显然,您会得到它的引用。

正如您链接的问题所述,您应该接受JavaScript的异步特性,并且流程从上到下都是同步的。它只是在getInfo函数内部是异步的,但这还不够,因为从其中流仍然保持同步。

我建议您只是为了了解自己在做什么,不要使用异步/等待,因为它会让您认为一切都是同步的,而不是同步的。

因此,只能在then函数内使用val值:

getInfo().then(function (val){
    // Your async code here
});

一旦您对这种思维方式充满信心,就可以使用 async / await 重构它,这几乎是语法糖,可以使代码看起来更好:

(async function () {
  async function getInfo () {
    // your code
  }

  datastore.info = await getInfo();

  console.log(datastore.info);

})();