約束から戻るthen()


118

私はこのようなjavascriptコードを持っています:

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

var test = justTesting();

varテストでは常に未定義の値を取得しています。それは約束がまだ解決されていないからだと思います。約束から値を返す方法はありますか?


21
then()呼び出しの戻り値は再びプロミスであり、戻り値をラップします。
シルコ

あなたは構文エラーがあります、これは解析さえしないと思います。
djechlin

4
例ではjustTestingは何も返さないため、テストは未定義です(戻り値はありません)。返品を追加すると、テストが約束として定義されます。
Jerome WAGNER、2015

1
フィードバックに感謝します。テストに出力+1を割り当てることがポイントです。
Priscy

4
変数とは何ですかpromise。どこで定義されているかを表示したり、justTesting()関数から何も返さない。より良い支援が必要な場合は、「オフ」になっていて実際に何をしようとしているのかさえわからないコードを表示するのではなく、解決しようとしている問題を説明する必要があります。解決しようとしている問題を説明してください。
jfriend00

回答:


136

then()コールバックから何かを返すとき、それは少し魔法です。値を返す場合、その値で次then()が呼び出されます。ただし、promiseのようなものを返す場合、next then()はそれを待機し、そのpromiseが解決した(成功/失敗した)場合にのみ呼び出されます。

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


この理由のように思われるので、stackoverflow.com
q / 53651266/2028440で

83
質問に答えませんでした。
アンドリュー


1
それで、解決策は何ですか?
アプルバ

58

promiseを使用するには、promiseを作成する関数を呼び出すか、promiseを自分で作成する必要があります。あなたが本当に解決しようとしている問題を本当に説明しているわけではありませんが、自分でプロミスを作成する方法は次のとおりです。

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

または、promiseを返す関数がすでにある場合は、その関数を使用してそのpromiseを返すことができます。

// 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ます。私はこれを実装したbcsが機能することを知っています(bcs linting new Promiseがから離れるように強制しました)が、そのreturn / returnペアを理解/考える方法を説明できますか?
ロニーロイストン

2
@RonRoyston-まず、渡す.then()関数は、それを含む関数とは別の関数であるため、呼び出されると、独自の戻り値を持ちます。次に、.then()ハンドラーからの戻り値がpromiseの解決された値になります。つまり、.then(val => {return 2*val;})解決された値をからvalに変更してい2*valます。
jfriend00 2018

13

ここで行ったことは、justTesting関数からpromiseを返したことです。その後、関数が解決されたときに結果を取得できます。

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

「//出力で何かをする」でreturnステートメントを入力するとどうなりますか?例:親関数内に「JustTesting()。then ...」があるとします。"then"部分内の値を返すことができますか?
mrzepka 2017

//出力から何かを実行して値を返したい場合は、justTesing()の前に戻り値を追加する必要があります。例: "return justTesting()。then((res)=> {return res;});
Vidur Singla

さて、それは私が期待していたものです。確認したいだけです:)ありがとう!
mrzepka 2017

それからテストを返すとどうなりますか?
MeVimalkumar

3

私は約束の混乱を取り除くために「await」コマンドと非同期関数を使用することを好みます、

この場合、最初に非同期関数を記述します。これは、この質問の「promise.then」の部分で呼び出される匿名関数の代わりに使用されます。

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

ここでは、メイン関数とサブ関数の両方を非同期関数に返したことに注意してください。


そうです... awaitを使用することで、問題がよりきれいになり、解決されました
karthikeyan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.