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()随后在其上注册的任何承诺都会立即进行.
这种模式的优点是,如果随后用异步替换同步代码,该函数仍然具有相同的外部接口.