これは不自然な例であることに注意してください。
_ function longFunc(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("long func completed");
deferred.resolve("hello");
}, 3000);
return deferred.promise();
}
function shortAfterLongFunc(x){
console.log('short func completed with value: ' + x);
return {
a: x
};
}
processFurther(longFunc().then(shortAfterLongFunc)); // send the array for further processing
_
問題
後のさらなるダウンストリーム処理のために任意の種類のオブジェクト/関数を返す方法を理解できませんshortAfterLongFunc
が完了します。 shortAfterLongFunc
からconsole.logを作成できますが、ここで必要なものではありません。 ここでフィドル
見てくれてありがとう!
更新:
質問を少しだけ良くするために...これは私が見ている単純なユースケースです:
_$.map(['H','E','L','L', 'O'], somefunc). // for each item in array apply somefunc function
function somefunc(x){ // gets called for each value 'H', 'E' etc. in the array by $.map()
var longfunc = function(y){
var deferred = $.Deferred();
setTimeout(function(){
console.log("long func completed");
deferred.resolve(y.toLocaleLowerCase());
}, 3000);
return deferred.promise();
};
var shortAfterLongFunc = function(x){
console.log('short func completed with value: ' + x);
return x;
}
// What should I do here
return longFunc(x).then(shortAfterLongFunc); // must return lower case char to the caller of someFunc
}
_
somefunc()
は、配列の各要素を小文字に処理するとします。ただし、この処理には長い時間がかかり、非同期であると想定します(setTimeoutを考えてください)。したがって、各要素の同期操作を保証することを約束します...しかし、promiseを使用すると、変換された値を返すことができません。
別のthen
呼び出しをチェーンするだけです。これは、shortAfterLongFunc
が新しいpromiseを返すため、さらに作業できるようにするためです。
longFunc().then(shortAfterLongFunc).then(function(data) {
console.log('all is complted', data);
});