Подождите, пока результат API будет возвращен в Javascript

Скажем, у меня есть функция, которая возвращает результат на вход через 1 секунду:

function slowDouble(num) {
    setTimeout(() => {
        return num * 2;
    }, 1000);
}

Теперь я хочу вызвать эту функцию и дождаться возврата результата, чтобы я мог выполнять над ней другие операции. Я попытался обернуть эту функцию в Promise, но результат возвращается в блок после выполнения оператора log (печать undefined):

function promisify(num) {
    return new Promise((resolve) => {
        var res = slowDouble(num);
        resolve(res);
    });
}

function promisifyTest(num) {
    promisify(num).then((res) => {
        console.log('then result ', res);
    })
}

promisifyTest(4); // undefined

Затем я попытался использовать await:

async function asyncCallToAPI(num) {
    var tt = await promisify(num);
    console.log('async result', tt);
}

asyncCallToAPI(3); // undefined

и получил тот же результат undefined. Я знаю, что это очень похоже на другие вопросы, заданные здесь, но я еще не мог понять это.


person Yar    schedule 03.10.2018    source источник
comment
Возможный дубликат stackoverflow .com/questions/39495551/   -  person Estus Flask    schedule 03.10.2018
comment
@estus Мой вопрос на самом деле касается обработки задержки, а не задержки.   -  person Yar    schedule 03.10.2018
comment
Я понимаю. Проблема в том, что slowDouble изначально неверен. Вы не можете ничего вернуть из обратного вызова setTimeout. slowDouble изначально должен использовать промисы или обратные вызовы каким-то другим способом.   -  person Estus Flask    schedule 03.10.2018


Ответы (1)


Вы неправильно заключаете setTimeout в обещание. Ваш slowDouble ничего не возвращает. Вот почему вы получаете undefined. Вам нужно изменить то, как вы написали это, чтобы функция slowDouble возвращала обещание, и вы могли избавиться от функции promisify.

Разница в том, что когда вы создаете промис, вам нужно иметь возможность вызывать обратный вызов resolve из обратного вызова для любой асинхронной функции, которую вы пытаетесь обернуть. В случае setTimeout нам нужно вызвать resolve из обратного вызова setTimeout.

function slowDouble(num) {
  return new Promise(resolve => {
    setTimeout(() => resolve(num * 2), 1000);
  });
}

async function promisifyTest(num) {
  const result = await slowDouble(num);
  console.log('Async result:', result);
}

console.log('Waiting...');
promisifyTest(4);

person kamoroso94    schedule 03.10.2018