web-dev-qa-db-ja.com

promiseが解決された後にPromiseオブジェクトから値をフェッチする方法

これは不自然な例であることに注意してください。

_    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を使用すると、変換された値を返すことができません。

9
Vikram

別のthen呼び出しをチェーンするだけです。これは、shortAfterLongFuncが新しいpromiseを返すため、さらに作業できるようにするためです。

longFunc().then(shortAfterLongFunc).then(function(data) {
    console.log('all is complted', data);
});

デモ: http://jsfiddle.net/ebt4pxxa/2/

8
dfsq