Jquery.deferred的语法,使同步函数返回promise

Pet*_*rov 2 javascript promise jquery-deferred

关于如何使用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'); });
Run Code Online (Sandbox Code Playgroud)

sayIt(2000)总是通过,但'then'之后的链式函数永远不会触发.

如果我这样做:

doIt().then( console.log('ah'));
Run Code Online (Sandbox Code Playgroud)

'啊'马上出现,然后我说'我说'2000ms之后 - 我想要的当然是相反的 - 两秒后我得到'我说的',然后'啊'.

任何建议赞赏!

Aln*_*tak 10

要同步执行某些操作但仍使用承诺,请执行以下操作:

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();
}
Run Code Online (Sandbox Code Playgroud)

结果是你仍然得到了一个承诺,但是这个承诺已经解决,所以.then()随后在其上注册的任何承诺都会立即进行.

这种模式的优点是,如果随后用异步替换同步代码,该函数仍然具有相同的外部接口.