Повернення з обіцянки тоді ()


118

У мене є такий код JavaScript:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

У мене завжди не визначене значення для тесту var. Я думаю, що це тому, що обіцянки ще не вирішені. Є спосіб повернути значення з обіцянки?


21
повернене значення then()дзвінка знову - це обіцянка, яка обгортає значення, яке повернув.
Сірко

У вас синтаксична помилка, я не думаю, що це навіть розбирається.
djechlin

4
тест не визначений, оскільки justTesting нічого не повертає у вашому прикладі (у вас немає повернення). Додати повернення і тест буде визначено як обіцянка.
Джером ВАГНЕР

1
Дякую за відгук. Справа в тому, щоб призначити вихід +1 для тесту.
Прісмі

4
Що таке змінна promise. Ви ніде не показуєте його визначеним і нічого не повертаєте зі своєї justTesting()функції. Якщо ви хочете отримати кращу допомогу, вам потрібно описати, яку проблему ви намагаєтеся вирішити, а не просто показувати нам код, який настільки "відключений", що він навіть не ілюструє те, що ви насправді намагаєтесь зробити. Поясніть проблему, яку ви намагаєтеся вирішити.
jfriend00

Відповіді:


136

Коли ви повертаєте щось із then()зворотного дзвінка, це трохи магія. Якщо ви повернете значення, наступне then()викликається з цим значенням. Однак якщо ви повернете щось подібне до обіцянки, наступне then()чекає на нього, і його називають лише тоді, коли ця обіцянка вляжеться (успішно / не виконано).

Джерело: https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing-asynchronous-action


здається , що з цієї причини, то я можу зробити обіцянку ланцюга для перебору масиву з допомогою Ajax запитів синхронно stackoverflow.com/q/53651266/2028440
BANG Rikimaru

83
Не відповів на запитання.
Андрій

Пов’язане посилання
Марінос

1
То яке рішення?
Апурва

58

Щоб використовувати обіцянку, потрібно або викликати функцію, яка створює обіцянку, або ви повинні створити її самостійно. Ви насправді не описуєте, яку проблему ви насправді намагаєтеся вирішити, але ось як би ви створили обіцянку самостійно:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

Або якщо у вас вже є функція, яка повертає обіцянку, ви можете використовувати цю функцію та повернути її:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}


2
що мене відкидає - це подвійне return, тобто justTestingкаже return.then => return. Я знаю, що це працює, тому що я реалізував це (зв'язки з примушуючи мене примусити мене відходити new Promise), але чи можете ви пояснити, як зрозуміти / думати про цю пару повернення / повернення?
Ронні Ройстон

2
@RonRoyston - По-перше, функція, яку ви .then()передаєте, - це окрема функція від функції, що містить, тому коли вона викликається, вона має своє власне повернене значення. По-друге, повернене значення від .then()обробника стає вирішеним значенням обіцянки. Отже, .then(val => {return 2*val;})змінюється вирішене значення з valна 2*val.
jfriend00

13

Що я тут зробив, це те, що я повернув обіцянку від функції justTesting. Потім ви можете отримати результат, коли функція буде вирішена.

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

Сподіваюся, це допомагає!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }

Що буде, якщо в "// зробити щось із результатом" я покладу виписку із поверненням? Наприклад: я мав би "JustTesting (). Then ..." в межах батьківської функції. Чи зможу я повернути значення в частині "тоді"?
mrzepka

Якщо ви хочете повернути значення з // зробити щось з виведенням, вам доведеться додати повернення перед justTesing (). Наприклад, "return justTesting (). Then ((res) => {return res;});
Vidur Singla

Добре, що я очікував, я просто хотів переконатися :) Дякую!
mrzepka

що робити, якщо ми повернемо тест відтоді?
MeVimalkumar

3

Я вважаю за краще використовувати функції "очікувати" команду та асинхронізацію, щоб позбутися від плутанини обіцянок,

У цьому випадку спершу я б написав асинхронну функцію, вона буде використовуватися замість анонімної функції, яка називається в частині "обещание.тем" у цьому запитанні:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

і тоді я б назвав цю функцію від головної функції:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

Зауваживши, що я повернув тут і основну функцію, і підфункцію, щоб асинхронізувати функції.


Правильно ... Використання
функцій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.