Kehre dann von einem Versprechen zurück ()

118

Ich habe einen Javascript-Code wie diesen:

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

var test = justTesting();

Ich habe immer einen undefinierten Wert für den Var-Test. Ich denke, das liegt daran, dass die Versprechen noch nicht gelöst sind. Gibt es eine Möglichkeit, einen Wert aus einem Versprechen zurückzugeben?

Priscy
quelle
21
Der Rückgabewert eines then()Anrufs ist wieder ein Versprechen, das den von Ihnen zurückgegebenen Wert umschließt.
Sirko
Sie haben einen Syntaxfehler, ich glaube nicht, dass dies überhaupt analysiert wird.
Djechlin
4
test ist undefiniert, da justTesting in Ihrem Beispiel nichts zurückgibt (Sie haben keine Rückgabe). Fügen Sie eine Rücksendung hinzu und der Test wird als Versprechen definiert.
Jerome WAGNER
1
Vielen Dank für das Feedback. Es geht darum, dem Test den Ausgang +1 zuzuweisen.
Priscy
4
Was ist die Variable promise. Sie zeigen es nirgendwo definiert an und geben nichts von Ihrer justTesting()Funktion zurück. Wenn Sie bessere Hilfe benötigen, müssen Sie beschreiben, welches Problem Sie lösen möchten, anstatt uns nur Code zu zeigen, der so "aus" ist, dass er nicht einmal veranschaulicht, was Sie wirklich versuchen. Erklären Sie das Problem, das Sie lösen möchten.
jfriend00

Antworten:

136

Wenn Sie etwas von einem then()Rückruf zurückgeben, ist es ein bisschen magisch. Wenn Sie einen Wert zurückgeben, wird der nächste then()mit diesem Wert aufgerufen. Wenn Sie jedoch etwas Versprechendes zurückgeben, then()wartet das nächste darauf und wird nur aufgerufen, wenn dieses Versprechen erfüllt ist (erfolgreich / fehlgeschlagen).

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

c0ming
quelle
Aus diesem Grund kann ich eine Versprechenskette für die synchrone Iteration von Arrays mit Ajax-Anforderungen in stackoverflow.com/q/53651266/2028440
Bằng Rikimaru
82
Hat die Frage nicht beantwortet.
Andrew
Verwandte Links
Marinos An
1
Was ist die Lösung?
Apurva
58

Um ein Versprechen zu verwenden, müssen Sie entweder eine Funktion aufrufen, die ein Versprechen erstellt, oder Sie müssen selbst eine erstellen. Sie beschreiben nicht wirklich, welches Problem Sie wirklich lösen möchten, aber so würden Sie selbst ein Versprechen erstellen:

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

Wenn Sie bereits eine Funktion haben, die ein Versprechen zurückgibt, können Sie diese Funktion verwenden und ihr Versprechen zurückgeben:

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

jfriend00
quelle
2
Was mich abschreckt, ist das Doppelte return, dh justTestingsagt return.then => return. Ich weiß, dass dies funktioniert, weil ich dies implementiert habe (bcs-Flusen haben mich dazu gezwungen new Promise), aber können Sie erklären, wie man dieses Return / Return-Paar versteht / denkt?
Ronnie Royston
2
@RonRoyston - Zunächst einmal ist die Funktion, an die Sie übergeben, .then()eine separate Funktion von der enthaltenen Funktion. Wenn sie aufgerufen wird, hat sie einen eigenen Rückgabewert. Zweitens wird der Rückgabewert eines .then()Handlers zum aufgelösten Wert des Versprechens. Ändert .then(val => {return 2*val;})also den aufgelösten Wert von valnach 2*val.
jfriend00
13

Was ich hier getan habe, ist, dass ich ein Versprechen von der justTesting-Funktion zurückgegeben habe. Sie können das Ergebnis dann erhalten, wenn die Funktion aufgelöst ist.

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

Hoffe das hilft!

// old answer

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

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }
Vidur Singla
quelle
Was würde passieren, wenn ich in "// etwas mit der Ausgabe machen" eine return-Anweisung setze? Zum Beispiel: Ich hätte das "JustTesting (). Then ..." in einer übergeordneten Funktion. Kann ich einen Wert innerhalb des "Dann" -Teils zurückgeben?
Mrzepka
Wenn Sie einen Wert von // zurückgeben möchten, müssen Sie vor justTesing () eine Rückgabe hinzufügen. Beispiel: "return justTesting (). Then ((res) => {return res;});
Vidur Singla
Okay, das habe ich erwartet, ich wollte nur sicher gehen :) Danke!
Mrzepka
Was ist, wenn wir den Test von dann zurückgeben?
MeVimalkumar
3

Ich bevorzuge die Verwendung von "Warten" -Befehls- und Async-Funktionen, um Verwirrungen von Versprechungen zu beseitigen.

In diesem Fall würde ich zuerst eine asynchrone Funktion schreiben, diese wird anstelle der anonymen Funktion verwendet, die unter "Versprechen.then" Teil dieser Frage aufgerufen wird:

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;

}

und dann würde ich diese Funktion von der Hauptfunktion aus aufrufen:

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

   return lv_result + 1;
}

Ich habe festgestellt, dass ich hier sowohl die Hauptfunktion als auch die Unterfunktion auf asynchrone Funktionen zurückgesetzt habe.

Beemaster
quelle
Richtig ... Das Warten hat es viel sauberer gemacht und das Problem gelöst
karthikeyan