0

Нужно вытянуть из Промиса значение в переменную
Используя только синтаксис Promise

let pr = new Promise((resolve, reject)=>{
    let random = 1
    setTimeout(()=>{
        if (random>0) { resolve('plus') }
        else { reject('minus') }
    }, 1000)
})

Если записываю в новую переменную так, то туда ожидаемо попадает Промис

let result = pr.then(res=>res).catch(err=>err)
console.log(result) //Promise {<fulfilled>: 'plus'}

Подскажите пожалуйста, тогда единственный вариант - это присвоение значения внутри then, catch, как показано ниже ?
Или есть еще вариант как присвоид значение, а не сам Промис, переменной используя синтаксис then, catch?

let result;
let error;
pr.then(res=>result=res).catch(err=>error=err)
//1 second later
console.log(result) //plus - можно как-то использовать дальше

Используя async, await (хз как это переписать на setTImeout, поэтому пример с урлом), присвоить данные из Промиса можно только используя промежуточную асинхронную функцию и ее вызов ?

async function check() {
    let res = await fetch('https://jsonplaceholder.typicode.com/todos/1')
    return await res.json()
}
let result
async function give() { result = await check() }
give();
console.log(result) //{userId: 1, id: 1, title: 'delectus aut autem', completed: false}

Или аналог в виде самовызывающейся асинхронки ?

(async ()=> result=await check())()
console.log(result) //{userId: 1, id: 1, title: 'delectus aut autem', completed: false}
console.log(result.id) //1 - можно как-то использовать дальше

Так же вопрос, если попытатся вывести результат сразу, то ничего не выйдет, так как он еще не получен. Как тогда быть в таком случает ?

let pr = new Promise((resolve, reject)=>{
 let random = 1 setTimeout(()=>{
  if (random>0) { resolve('plus') }
  else { reject('minus') } }, 1000) })
let result = pr.then(res=>res).catch(err=>err)
console.log(result) //undefined - Промис еще не вернул результат

Как результат использовать дальше ?

  • «Но как тогда его использовать дальше ?» — дождаться его появления через then или await, вы в своём вопросе уже описали все способы как это делать – andreymal Aug 09 '23 at 21:39
  • 1
    "Но как тогда его использовать дальше ?" --- смотри этот ответ: https://ru.stackoverflow.com/a/1476674/191482 по факту, вся работа с запросами в таком случае (если надо сложить результат в переменную и потом где-то использовать) сведётся к оформлению либо класса, либо модуля, либо обёртки над всем происходящим в виде асинхронной анонимной самовызывающейся функции.....и вот этот вот console.log придётся помещать именно внутрь этого всего, а не вне – Алексей Шиманский Aug 10 '23 at 06:36
  • @andreymal я в своем же вопросе, показал пример, который в такой способ - выводит undefined. let pr = new Promise((resolve, reject)=>{ let random = 1; setTimeout(()=>{ if (random>0) { resolve('plus') } else { reject('minus') } }, 1000) }); let result; let error; pr.then(res=>result=res).catch(err=>error=err); console.log(result) – Mr.StupidQuestions Aug 10 '23 at 14:59
  • @Mr.StupidQuestions ваш последний пример вообще синтаксически некорректен. Но даже если починить синтаксис, console.log выводит Promise { <state>: "pending" } как и должно быть, никаких undefined там нет – andreymal Aug 10 '23 at 15:00
  • @andreymal тут в комментах неудобно код вставлять. Расставил что б все в линию работало, и console.log выводит undefined let pr = new Promise((resolve, reject)=>{ let random = 1; setTimeout(()=>{ if (random>0) { resolve('plus') } else { reject('minus') } }, 1000) }); let result; let error; pr.then(res=>result=res).catch(err=>error=err); console.log(result) – Mr.StupidQuestions Aug 10 '23 at 15:04
  • @Mr.StupidQuestions undefined — это значение, которое возвращает сама функция console.log, сделайте console.log(2+2) и вы тоже увидите undefined, промисы здесь вообще ни при чём – andreymal Aug 10 '23 at 15:05
  • @andreymal я вот про это

    let pr = new Promise((resolve, reject)=>{ let random = 1; setTimeout(()=>{ if (random>0){ resolve('plus')} else { reject('minus')} }, 1000) }); let result; let error; pr.then(res=>result=res).catch(err=>error=err); console.log('2+2', result)

    2+2 undefined В обоих случаях возвращает undefined

    – Mr.StupidQuestions Aug 10 '23 at 15:23
  • @Mr.StupidQuestions а в этом коде вы выполняете console.log раньше чем отработает then, поэтому в result значения ещё нет. А чтобы оно там было, нужно дождаться его появления, а чтобы его дождаться, нужно использовать then или await – andreymal Aug 10 '23 at 15:41
  • @andreymal да причина верна, но в этом же коде, выше я уже использовал then, catch, для записи результата в переменные (result или error) - pr.then(res=>result=res).catch(err=>error=err) – Mr.StupidQuestions Aug 10 '23 at 16:42
  • @Mr.StupidQuestions «я уже использовал then» — нет, для console.log вы НЕ использовали then – andreymal Aug 10 '23 at 16:55
  • @andreymal вы предлагаете console.log(result) поместить внуть then, где переменной result присваивалось значение из Промиса ? pr.then(res=>{result=res; console.log(result)}); Так ? – Mr.StupidQuestions Aug 10 '23 at 17:18
  • @АлексейШиманский тут проблема в том, что синхронный код после такой асинхронной самовызывающейся функции выполнится раньше этой фукнции. Например: let result=0; let pr=new Promise((resolve, reject)=>{ let random=1; setTimeout(()=>{ if (random>0) { resolve('plus') } else { reject('minus') } }, 1000) }); (async ()=>{ result=await pr; console.log('result inside ', result) })(); console.log('result out', result) Сначала отработает синхронный код после самовызывающейся функции, где результат еще не получен - result out undefined, затем сама фукнция – Mr.StupidQuestions Sep 06 '23 at 19:58
  • @Mr.StupidQuestions я дал конкретную ссылку с конкретным ответом.... зачем ты упорно пытаешься писать console.log('result out', result) вне async функции остаётся загадкой... – Алексей Шиманский Sep 06 '23 at 20:20

0 Answers0