【发布时间】: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