3

いくつかのロジックが延期されているメソッドを呼び出しています。そのロジックが終了したら、呼び出し先に値を返します。下記参照:

//Callee.js
var myAssistant = new Assistant();
console.log(myAssistant.whatIsTheValue());



//Assistant.js
whatIsTheValue : function(someArg) {
   var deferred = someService.getSomething();
   deferred.then(lang.hitch(this, this._getTheValue));

   //In theory, I want to return whatever this._getTheValue returns, how can I do that?!
}

_getTheValue() {
   ...
   ...
   return xyz;
}
4

3 に答える 3

2

Deferred は非同期操作です。したがって、現在の関数コンテキストが完了するまで実行されないため、通常の方法で変数を返すことはできません。

その値をさらに処理したい場合は、別のコールバック (then ステートメントをチェーンする IE) に関して行う必要があります。

deferred のポイントは、コールバックに順次操作を提供することです。したがって、それらを連鎖させて、必要な結果を得ることができます。現在の実行コンテキストで結果を利用できるようにする必要がある場合は、必要なことを行う同期 (遅延ではない) メソッドを見つける必要があります。

だから、このようなもの

//Assistant.js
whatIsTheValue : function(someArg) {
   var deferred = someService.getSomething();
   var next = deferred.then(lang.hitch(this, this._getTheValue));
   next.then(/*insert next function here*/);
}

遅延 lang.hitch の使用は、whatistheValue の操作が完了するまで実行されないことを理解する必要があります。したがって、whatisthevalue と呼ばれる関数に値を返す代わりに、その値を処理するロジックを新しい関数に入れ、それを deferred の追加のコールバックとして使用する必要があります。これには、おそらくプログラムの再構築が必要になるでしょう。

于 2013-01-10T17:26:35.770 に答える
1

$when代わりにJQuery を使用してください。

// assuming both getData and getLocation return their respective Promise
var combinedPromise = $.when(getData(), getLocation())

// function will be called when both getData and getLocation resolve
combinePromise.done(function(data,location){
  alert("We got data: " + dataResult + " and location: " + location);
}); 

http://www.html5rocks.com/en/tutorials/async/deferred/

于 2013-01-10T17:34:20.937 に答える
1

あなたが何をしているのかわかりませんlang.hitchが、解決策は次のようになります。

Assistant.prototype.whatIsTheValue = function(someArg) {
    var deferred = someService.getSomething();
    return deferred.then(lang.hitch(this, this._getTheValue));
//  ^^^^^^
};

var myAssistant = new Assistant();
myAssistant.whatIsTheValue().then(console.log); // use console.log.bind(console) in Chrome
//                           ^^^^ - it is a promise you return
于 2013-01-10T17:31:39.817 に答える