Подождите, пока результат API будет возвращен в Javascript - PullRequest
0 голосов
/ 03 октября 2018

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

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

Теперь я хочу вызвать эту функцию и подождать, пока результат не будет возвращен, чтобы я мог выполнять другие операции надЭто.Я попытался обернуть эту функцию в Promise, но результат возвращается в блок then после выполнения оператора 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.Я знаю, что это очень похоже на другие вопросы, задаваемые здесь, но я пока не могу понять это.

1 Ответ

0 голосов
/ 03 октября 2018

Вы неправильно упаковываете 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...