Потому что вы не дожидались его окончания.
В основном вам нужно дождаться setTimeout.
async run (data) {
await setTimeout(() => data.response.outcome = 'success',500)
}
но это не работает, потому что setTimeout не обещание
Вы можете использовать простую функцию сна, которая разрешается через некоторое время.
async function sleep (time) {
return new Promise(resolve => setTimeout(resolve, time));
}
async function run (data) {
await sleep(500);
data.response.outcome = 'success';
}
Так же, как setTimeout, который является API обратного вызова, может быть превращен в обещание, потоки могут быть превращены в обещание. Обратите внимание, что в примерах как sleep, так и readFile я использую ключевое слово async, чтобы прояснить ситуацию
async readFile (file) {
return new Promise((resolve, reject) => {
let data = '';
fs.createReadStream(file)
.on('data', d => data += d.toString())
.on('error', reject)
.on('end', () => resolve(data));
});
}
Для большинства функций вы можете пропустить обещание вручную и использовать util.promisify
const { readFile } = require('fs');
const { promisify } = require('util');
const readFileAsync = promisify(readFile);
Ключевым моментом является то, что обещания должны разрешиться после выполнения работы, и что вы должны ждать этого, используя await
или .then
Например, чтобы прояснить ситуацию, первый пример
async function run (data) {
return sleep(500).then(() => data.response.outcome = 'success';);
}
и даже
function run (data) {
return sleep(500).then(() => data.response.outcome = 'success';);
}
все то же самое во время выполнения
Итак, чтобы закончить
async function transform (inputFile, targetWidth, targetHeight) {
return new Promise((resolve, reject) => {
let transformer = sharp()
.resize(targetWidth, targetHeight)
.crop(sharp.strategy.entropy)
.on('info', { width, height } => console.log(`Image created with dimensions ${height}x${width}`)
.on('error', reject)
.on('end', resolve);
inputFile.pipe(transformer);
});
}