在继续之前等待Bluebird承诺解决

时间:2018-04-21 20:44:23

标签: javascript node.js promise bluebird reddit

我正在使用名为snoowrap的NPM程序包来访问Reddit API。它会返回结果,例如来自搜索的结果,如Bluebird所承诺的那样。

我有这样的文件reddit.js

const snoowrap = require('snoowrap');

function getFirstSearchResultUrl() {
  // Actual Reddit API credentials not included.
  const r = new snoowrap({
    userAgent,
    clientId,
    clientSecret,
    username,
    password,
  });

  return r
    .search({
      query: 'query',
      subreddit: 'askreddit',
    })
    .then((posts) => {
      return posts[0].url;
    });
}

const resultUrl = getFirstSearchResultUrl();
console.log(resultUrl);

console.log打印[chainable Promise]而不是返回的网址。

如何让它打印返回的URL,而不是承诺?我查看了文档并尝试了不同的Bluebird方法,例如.reflect().settle(),但它们似乎并不适合我。

在承诺完成之前,是否可以阻止脚本的其余部分执行?

1 个答案:

答案 0 :(得分:1)

您的getFirstSearchResultUrl()会返回一个承诺。这就是为什么你看到打印日志声明的原因。并且承诺尚未解决。

因此,您可以等待async/await解析它,或者您可以记录返回的结果,并使用.then()getFirstSearchResultUrl()添加回调。

getFirstSearchResultUrl().then(url=> console.log(url))

这样的东西

您也可以await解析getFirstSearchResultUrl(),获取结果并记录

这样的东西
(async function(){
  var url  =  await getFirstSearchResultUrl();
  console.log(url);
})();