У меня возникли некоторые проблемы с пониманием того, как работает функциональность Promise. Раньше я использовал Bluebird, но хотел попробовать изучить новый стандарт await/async, чтобы стать лучше как программист. Я использовал async/await и создал обещания там, где считаю нужным, однако функции по-прежнему выполняются не по порядку.
Я запускаю это в последней версии Node с 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.');
}
},
};
resolve
- person Jonas Wilms   schedule 04.12.2017$.ajax
: developer.mozilla.org/en-US/docs/Web/API/Fetch_API - person HMR   schedule 04.12.2017async/await
— частью ES2017. - person Felix Kling   schedule 08.12.2017