我在理解Promise功能如何工作方面遇到了一些问题,我之前使用过Bluebird,但我想尝试学习新的await / async标准,以便作为程序员进行改进 . 我已经使用了async / await并在我认为合适的情况下创建了promises但是函数仍然无序执行 .
我在最新版本的Node with Webpack上运行它,我没有收到任何有意义的错误 . 它运行良好,不像预期的那样 . 运行时我的输出是:
Searching the Web for: Test String
Web search Completed!
Promise { <pending> }
Response Handler Completed!
理想情况下,我希望它回应:
Searching the Web for: Test String
Response Handler Completed
Web search Completed
然后返回我的响应处理程序的输出 .
谁能发现我的错误?
const https = require('https');
// Replace the subscriptionKey string value with your valid subscription key.
const subscriptionKey = '<samplekey>';
const host = 'api.cognitive.microsoft.com';
const path = '/bing/v7.0/search';
const response_handler = async (response) => {
return new Promise((resolve, reject) => {
let body = '';
response.on('data', (d) => {
body += d;
resolve(body);
});
response.on('end', () => {
console.log('\nRelevant Headers:\n');
for (const header in response.headers)
// header keys are lower-cased by Node.js
{
if (header.startsWith('bingapis-') || header.startsWith('x-msedge-')) { console.log(`${header}: ${response.headers[header]}`); }
}
body = JSON.stringify(JSON.parse(body), null, ' ');
//console.log('\nJSON Test Response:\n');
//console.log(body);
});
response.on('error', (e) => {
console.log(`Error: ${e.message}`);
});
console.log('Response Handler Completed!');
});
};
const bing_web_search = async (search) => {
return new Promise((resolve, reject) => {
console.log(`Searching the Web for: ${search}`);
const request_params = {
method: 'GET',
hostname: host,
path: `${path}?q=${encodeURIComponent(search)}&$responseFilter=${encodeURIComponent('Webpages')}&count=${50}`,
headers: {
'Ocp-Apim-Subscription-Key': subscriptionKey,
},
};
const req = https.request(request_params, response_handler);
console.log('Web search Completed!');
console.log(req.body);
req.end();
});
};
module.exports = {
search: async (search) => {
if (subscriptionKey.length === 32) {
const result = await bing_web_search(search);
console.log('Search Completed');
} else {
console.log('Invalid Bing Search API subscription key!');
console.log('Please paste yours into the source code.');
}
},
};
1 回答
有点晚了,但是下面的内容应该让你在路上,我对代码进行了更改 . 如果您有任何疑问,请告诉我 .
[update]
您的评论建议您不要正确调用搜索或处理它正确返回的承诺 . 您无法控制响应在第一个请求最后返回的一组响应中所花费的时间 . 这就是你有Promise.all的原因
如果你有很多搜索,那么你可能希望用一定的time period或active connections来限制响应的数量 . 如果您需要帮助,请告诉我 .