PP.*_*PP. 15 javascript q
I want to do something like the following:
delay( 2500 )
.then( function () { console.log( "Step 1 done" ) } )
.then( delay( 7500 ) )
.then( function () { console.log( "Step 2 done" ) } );
Run Code Online (Sandbox Code Playgroud)
So implementation of delay has been demonstrated many times before:
function delay( ms ) {
var deferred = Q.defer();
setTimeout( deferred.resolve, ms );
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
But if I run the above in node.js I get:
... delay of 2500ms
Step 1 done
Step 2 done
... delay of ~7500ms
Run Code Online (Sandbox Code Playgroud)
rather than what I expect to see:
... delay of 2500ms
Step 1 done
... delay of 7500ms
Step 2 done
Run Code Online (Sandbox Code Playgroud)
In the examples provided on https://github.com/kriskowal/q/wiki/Examples-Gallery I can't find any examples of synchronous functions (functions that return a value without any callbacks involved) chained with promise functions.
有关如何将同步操作与异步承诺混合的任何想法?
我试过了:
function synchronousPromise() {
var deferred = Q.defer();
console.log( "Synchronous function call" );
deferred.resolve();
return deferred.promise;
}
delay( 2500 )
.then( function(){synchronousPromise()} )
.then( function(){delay( 7500 )} )
.then( function(){synchronousPromise()} );
Run Code Online (Sandbox Code Playgroud)
这输出:
... delay of 2500ms
Time now is 2013-06-20
Time now is 2013-06-20
... delay of 7500ms
Run Code Online (Sandbox Code Playgroud)
..仍然不是我想要实现的目标.
Fel*_*ing 13
如果要链接回调,则必须从其中一个回调中返回一个新的promise对象.在你的第一个例子中,你写
.then( delay( 7500 ) )
Run Code Online (Sandbox Code Playgroud)
这意味着你要传递一个promise对象.then,而不是一个函数.根据Promise/A +提案(后面的Q),必须忽略所有非函数参数.所以,基本上就像你写的一样:
delay( 2500 )
.then( function () { console.log( "Step 1 done" ) } )
.then( function () { console.log( "Step 2 done" ) } );
Run Code Online (Sandbox Code Playgroud)
相反,传递调用delay并返回promise对象的函数:
delay( 2500 )
.then( function () { console.log( "Step 1 done" ); } )
.then( function () { return delay( 7500 ); } )
.then( function () { console.log( "Step 2 done" ); } );
Run Code Online (Sandbox Code Playgroud)
现在,只有delay在第二个回调中返回的promise对象被解析后,才会调用最后一个回调.
| 归档时间: |
|
| 查看次数: |
18084 次 |
| 最近记录: |