【问题标题】:Wait for Bluebird promise to resolve before continuing等待蓝鸟承诺解决后再继续
【发布时间】:2018-10-02 06:13:10
【问题描述】:

我正在使用一个名为 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。

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

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

【问题讨论】:

  • 你真的应该先了解一下promise。
  • getFirstSearchResult 返回一个承诺,因此您可以链接 .then() 阶段,或者如果您想采用命令式方式,请在异步函数中使用 await-async
  • 不能立即记录 url - 它还没有到达。你得到的只是一个承诺,它将与 infuture 的 url 一起实现 - 你可以在它存在时安排回调运行:getFirstSearchResultUrl().then(resultUrl => { console.log(resultUrl); });
  • 是否有可能完全阻止脚本的其余部分执行,直到 promise 得到解决?或者我只需将需要其结果的所有内容都放在then 回调函数中?
  • 不。它是同步工作流。即使可以,正如@Bergi 所说,您也不能像这样将承诺的解决方案分配给变量。您可以使用.then() 链接承诺或使用async-await abstraction

标签: javascript node.js promise bluebird reddit


【解决方案1】:

您的getFirstSearchResultUrl() 返回一个承诺。这就是您看到打印的日志语句的原因。而且promise还没有解决。

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

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

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

有点像

(async function(){
  var url  =  await getFirstSearchResultUrl();
  console.log(url);
})(); 

【讨论】:

  • .then一样——没有阻塞。
  • @destoryer 谢谢你。不清楚
  • async/await 在这里真的没有任何理由。对于新手来说,在返回的承诺上使用.then() 更简单,也许更容易解释。
猜你喜欢
  • 2015-06-26
  • 2021-05-21
  • 1970-01-01
  • 2018-12-14
  • 2016-03-19
  • 1970-01-01
  • 2017-09-19
  • 2016-12-01
  • 2018-08-09
相关资源
最近更新 更多