2

Jquery.deferredを使用して、低速の同期関数が代わりにpromiseを返すようにする方法についての簡単な質問。私がこれまでにやったことはこれです:

function sayIt(ms) {
    setTimeout( function() { console.log('what I say'); }, ms);
} 

function doIt() {
    return $.Deferred( function() { sayIt(2000); }).promise();
}


doIt().then( function() { console.log('ah'); });

sayIt(2000)は常に通過しますが、「then」の後の連鎖関数は起動しません。

私がこれを行う場合:

doIt().then( console.log('ah'));

「ah」がすぐに表示され、2000ms後に「私が言うこと」が表示されます。もちろん逆です。2秒後に「私が言うこと」を取得し、その直後に「ah」を取得します。

どんな提案もありがたいです!

4

2 に答える 2

10

同期的に何かを行うが、それでも promise を使用するには、次のようにします。

function slowPromise() {

    var def = $.Deferred();

    // do something slow and synchronous
    ...

    // resolve the deferred with the result of the slow process
    def.resolve(res);

    // and return the deferred
    return def.promise();
}

その結果、Promise は取得されますが、その Promise は既に解決されているため、.then()後で登録されたものはすぐに処理されます。

このパターンの利点は、後で同期コードを非同期コードに置き換えた場合でも、関数の外部インターフェイスが同じままであることです。

于 2012-05-19T11:04:44.907 に答える