Bir sözden döndükten sonra ()


119

Bunun gibi bir javascript kodum var:

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

var test = justTesting();

Var testi için her zaman tanımsız bir değere sahibim. Sanırım sözler henüz çözülmediğinden ... Bir sözden değer getirmenin bir yolu var mı?


21
bir then()çağrının dönüş değeri yine bir vaattir ve döndürdüğünüz değeri tamamlar.
Sirko

Bir sözdizimi hatanız var, bunun ayrıştırıldığını bile sanmıyorum.
djechlin

4
test tanımsızdır çünkü justTesting örneğinizde hiçbir şey döndürmez (geri dönüşünüz yoktur). Bir iade ekleyin ve test bir söz olarak tanımlanacaktır.
Jerome WAGNER

1
Geri bildirim için teşekkürler .. Önemli olan, test etmek için çıkış +1 atamaktır.
Priscy

4
Değişken nedir promise. Onu hiçbir yerde tanımlamazsınız ve justTesting()işlevinizden hiçbir şey döndürmezsiniz . Daha iyi yardım istiyorsanız, bize gerçekten yapmaya çalıştığınız şeyi göstermeyecek kadar "kapalı" olan kodu göstermek yerine çözmeye çalıştığınız sorunu açıklamanız gerekir. Çözmeye çalıştığınız sorunu açıklayın.
jfriend00

Yanıtlar:


136

Geri aramadan bir şey then()geri verdiğinizde, bu biraz sihirdir. Bir değer döndürürseniz, sonraki then()o değerle çağrılır. Bununla birlikte, vaat gibi bir şey iade ederseniz, bir sonraki then()onu bekler ve yalnızca bu vaat gerçekleştiğinde (başarılı / başarısız olduğunda) çağrılır.

Kaynak: https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing-asynchronous-actions


bu nedenle görünüyor, o zaman ajax istekleriyle eşzamanlı olarak dizi yinelemek için söz zinciri yapabilirim: stackoverflow.com/q/53651266/2028440
Bằng Rikimaru

86
Soruyu cevaplamadı.
Andrew


1
Peki çözüm nedir?
Apurva

58

Bir vaadi kullanmak için, ya bir vaat oluşturan bir işlevi çağırmanız ya da kendiniz bir tane oluşturmanız gerekir. Gerçekten çözmeye çalıştığınız sorunu tarif etmiyorsunuz, ancak burada kendi kendinize nasıl bir söz yaratacağınız:

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);
}

Ya da zaten bir söz veren bir işleviniz varsa, bu işlevi kullanabilir ve sözünü geri verebilirsiniz:

// 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
beni şaşırtan şey dublör return, yani justTestingdiyor return.then => return. Bunun işe yaradığını biliyorum, bunu uyguladım (bcs linting beni buna zorladı new Promise), ancak bu dönüş / dönüş çiftini nasıl anlayacağınızı / düşüneceğinizi açıklayabilir misiniz?
Ronnie Royston

2
@RonRoyston - Öncelikle, ilettiğiniz .then()işlev içeren işlevden ayrı bir işlevdir, bu nedenle çağrıldığında kendi dönüş değerine sahiptir. İkinci olarak, bir .then()işleyicinin dönüş değeri , sözün çözümlenmiş değeri haline gelir. Yani, .then(val => {return 2*val;})çözümlenen değeri olarak olarak valdeğiştiriyor 2*val.
jfriend00

13

Burada yaptığım şey, justTesting işlevinden bir söz verdiğimdir. Daha sonra, fonksiyon çözüldüğünde sonucu alabilirsiniz.

// 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);
  });

Bu yardımcı olur umarım!

// old answer

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

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

"// çıktıyla bir şeyler yap" kısmına bir dönüş ifadesi koyarsam ne olur? Örneğin: Bir üst işlev içinde "JustTesting (). Sonra ..." olurdum. "O zaman" bölümünde bir değer döndürebilir miyim?
mrzepka

Çıktıyla // bir şeyler yapmaktan bir değer döndürmek istiyorsanız, justTesing () 'den önce bir dönüş eklemeniz gerekir. Örnek, "return justTesting (). Sonra ((res) => {return res;});
Vidur Singla

Pekala, beklediğim buydu, sadece emin olmak istedim :) Teşekkürler!
mrzepka

o zaman sonra testi geri verirsek?
MeVimalkumar

3

Söz karışıklığından kurtulmak için "await" komutunu ve eşzamansız işlevleri kullanmayı tercih ediyorum.

Bu durumda önce asenkron bir fonksiyon yazacağım, bu sorunun "promise.then" bölümünde adı geçen anonim fonksiyon yerine kullanılacaktır:

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;

}

ve sonra bu işlevi ana işlevden çağırırım:

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

   return lv_result + 1;
}

Burada hem ana işlevi hem de alt işlevi zaman uyumsuz işlevlere döndürdüğüme dikkat edin.


Doğru ...
await'i kullanmak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.