2016-05-08 7 views
1

以下の例では、doSomethingOneの要求に対するサーバの応答が、doSomethingTwoの要求に対するサーバの応答の前に戻ってくる要求がありますか? doSomethingOneが投稿したはずのデータを含め、doSomethingOneは、DBにデータを投稿され、その後、doSomethingTwoはデシベルを照会しているし、いくつかのデータを返す、ため`.then()`は `.then()`の順序とは異なる順序で応答を返します。

$scope.pace = $interval (
    function() { 

     // code 

    }, 1000, 10 

).then(postResult) 
    .then(doSomethingOne) 
     .then(doSomethingTwo); 

質問であること。

doSomethingTwoさんのリクエストに対する応答には、doSomethingOneさんが投稿した最新のデータは含まれていません($scope.paceが最初からやり直されるまで)。

私はコールバックを強く理解していません(そのことに関する多くの読書にもかかわらず)ので、アドバイスをいただければ幸いです。

ブリーフ明確化

doSomthingOne$http.post()doSomethingTwo$http.get()をしを行います。ここでは約束は使用されていません。

+0

。 –

+0

関数 'doSomthingOne'と' doSomethingTwo'を表示する必要があります。しかし、 ''約束が使われていない場合 '' doSomethingTwo''は 'doSomthingOne'の直後に呼び出されるので、' 'post''と' get''はほぼ同時に発生し、 'get'要求がサーブに到達する可能性もあります'post'の前に。 –

答えて

2

更新:あなたの編集から

doSomthingOneは$ http.post()を行い、doSomethingTwoは$ http.get()しません。ここでは約束は使用されていません。

まあ、$http.postreturns a promise(時にはドキュメントの「未来」と呼ばれる)が、あなたはそれを使用していない場合は、何もPOSTが完了する前に呼び出されるからdoSomethingTwoを防ぎません。実際には、は非常にです。これは、POSTが完了する前(長い時間前)に呼び出される可能性があります。

約束を返すことで問題を解決することができます。返品する(または約束した約束をあなたが使用している場合はそれを返す)ことができます。例えば:以下に

function doSomethingOne() { 
    return $http.post(/*...args...*/); 
} 

又は

function doSomethingOne() { 
    return $http.post(/*...args...*/).then(/*...*/); 
} 

詳細。

オリジナル回答(まだ関連は):

それはdoSomethingOneが何をするかに依存し、何が返されます。 doSomethingOneが非同期プロセスを開始したにもかかわらず、がそのプロセスの約束を返さない場合は、そのプロセスが完了する前にdoSomethingTwoを呼び出すことができます。 doSomethingOneが同期して(あなたの言ったことは考えにくい)、その非同期作業の約束を返したら、doSomethingTwoが解決するのを待つので、doSomethingTwoが呼び出される前に完了します。

はここdoSomethingOneが非同期作業のための約束を返さない例だし、そうdoSomethingTwodoSomethingOneの非同期作業が完了する前に実行する可能性がある:

// Simulate an asynchronous DB call 
function dbCall(data) { 
    return new Promise(function(resolve) { 
    setTimeout(function() { 
     resolve("Result for " + data); 
    }, Math.floor(Math.random() * 500)); 
    }) 
} 
function start() { 
    console.log("start called"); 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log("start resolving"); 
     resolve(); 
    }, 0); 
    }) 
} 
function doSomethingOne() { 
    // THIS IS PROBABLY WRONG 
    console.log("doSomethingOne called"); 
    dbCall("one data").then(function(result) { 
    console.log("doSometingOne's async is done"); 
    }); 
} 
function doSomethingTwo() { 
    console.log("doSomethingTwo called"); 
} 
start().then(doSomethingOne).then(doSomethingTwo); 

Live copy on Babel's REPL

は、それはおそらくです違う。代わりに、doSomethingOneが非同期作業から約束を返すようにします。それはちょうどdbCall(...).thenにその呼び出しの結果を返すことでそれを行うことができます:それは `doSomethingOne`がないとそれが返すものに依存

// Simulate an asynchronous DB call 
function dbCall(data) { 
    return new Promise(function(resolve) { 
    setTimeout(function() { 
     resolve("Result for " + data); 
    }, Math.floor(Math.random() * 500)); 
    }) 
} 
function start() { 
    console.log("start called"); 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log("start resolving"); 
     resolve(); 
    }, 0); 
    }) 
} 
function doSomethingOne() { 
    console.log("doSomethingOne called"); 
    return dbCall("one data").then(function(result) { 
//^^^^^^^------------------------------------------- change is here 
    console.log("doSometingOne's async is done"); 
    }); 
} 
function doSomethingTwo() { 
    console.log("doSomethingTwo called"); 
} 
start().then(doSomethingOne).then(doSomethingTwo); 

Live copy on Babel's REPL

+0

私はこれを理解しようとしています(最後の例)。 'setTimeout'をdbCallに組み込む目的は何ですか? –

+0

@pandaman: '$ http.post'のように、非同期にするには。 –

+0

関数の最後に 'return'を追加すると、関数が完了するまで次の' .then() 'は起動しません。また、 'return;だけで動作するように見え、セミコロンの後ろには何も返されません。 –

関連する問題