2

簡単に言えば、コールバック関数なしでこのようなことを行うことは可能ですか?

function foo(){
  return 'foo';
}
function bar(){
  x = setTimeout(foo, 2000);
  alert(x);
}

foo() 関数を変更せずに。仲介機能を追加するのは問題ありませんが、それでは何も達成できないと思います。

長い話: 私は、window.open を介して window.showModalDialog をシミュレートしようとしています。私が見つけた唯一の提案は、while ループを使用するか、サーバーに ping を実行して sleep() をシミュレートすることです。どちらのソリューションも理想的ではありません。コールバック関数メソッドを除いて、このようなことを行う他の方法があるかどうか疑問に思っていますか?

4

4 に答える 4

6

簡単な答え:いいえ

もっと詳しくお答えしたいと思いますが、「短い」回答を求めて別の「コールバック」を除外したため、これだけは言えません。

setTimeoutタイムアウトをクリアするために常に識別子を返し、渡した関数から返されたものはすべて無視されます。setTimeout

于 2012-12-05T19:15:04.850 に答える
3

いいえ、それはできません。それでも、将来の値を表し、後でコールバックを追加できるもの、つまりPromiseを返すことができます。

于 2012-12-05T19:16:12.343 に答える
0

設計をリファクタリングします。探しているものをタイムアウトで実装できる可能性が高いですが、これは好きではありません。慣習に逆らわないで、コールバックを使用してください

function foo(){
 alert('foo');
}
function bar(){
 setTimeout(foo, 2000);
}

タイムアウトを変数に保存する限り、それはタイムアウトのクリアに使用されます。

timeoutID = setTimeout();
window.clearTimeout(timeoutID);
于 2012-12-05T19:16:30.780 に答える
0

setTimout はすでに何かを返していますが、それは評価された式の値ではありません。必要に応じて中止したり、後で他のことを実行したりできるタイムアウト オブジェクトを返します。setTimeout は、関数に将来実行するように指示するだけです。

状況に応じて機能する可能性のある機能を取得したい場合は、次のようなものを使用できます。

var answer = null;
setTimeout(function() {
    /*do something to 'answer'*/
    answer = 14;
}, 1000);

注: これは、"answer" がいつ設定されるかをほとんど制御できないことを意味します。そのため、コールバックを使用することが常に最善である理由は、「将来、値を取得したときに、この関数を実行する」ことをコードに伝えているからです。

于 2015-04-17T23:32:15.920 に答える