更新:あなたの編集から
:
doSomthingOneは$ http.post()を行い、doSomethingTwoは$ http.get()しません。ここでは約束は使用されていません。
まあ、$http.post
returns 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
が非同期作業のための約束を返さない例だし、そうdoSomethingTwo
は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() {
// 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
。 –
関数 'doSomthingOne'と' doSomethingTwo'を表示する必要があります。しかし、 ''約束が使われていない場合 '' doSomethingTwo''は 'doSomthingOne'の直後に呼び出されるので、' 'post''と' get''はほぼ同時に発生し、 'get'要求がサーブに到達する可能性もあります'post'の前に。 –