虽然有example in Ractive docs,但我是承诺的首发,我不理解上述例子:
var Promise = Ractive.Promise;
var p = new Promise( function ( fulfil, reject ) {
doSomethingAsync( function ( error, result ) {
if ( error ) {
return reject( error );
}
fulfil( result );
});
});
如何使用Ractive的实现以异步方式运行某些功能?
编辑:一个用例示例是当我在同一个函数中执行同步和异步操作时,我需要在所有这些操作所在的地方返回一个Promise处理。
答案 0 :(得分:3)
这是一个关于承诺的问题,而不是关于Ractive的问题,所以this MDN article值得一读,尽管它有点重。
但基本上,如果您想等到几个操作完成,请使用Promise.all
:
var ready = Promise.all([
getJSON( '/data.json' ), // async (returns a promise)
domReady(), // async
reticulateSplines() // sync
]);
getJSON
和domReady
将同时执行。 reticulateSplines
也是如此,因为它是同步的,所以不重要。 ready
的值现在是一个承诺,它将使用包含这三个操作的结果的数组来实现:
ready.then( function ( values ) {
var data = values[0];
var document = values[1];
var splines = values[2];
// some code happens
}).catch( function ( err ) {
// if something went wrong with any of those three
// functions (e.g. couldn't find data.json), we'll
// end up here
});
如果您使用babel之类的代码转换代码,您也可以使用解构:
ready.then( ([ data, document, splines ]) => {
// some code happens
}).catch( err => {
// handle error
});
另一个有用的功能,如果你正在处理may-sync-maybe-async的东西(尽管最好避免那种事情)是Promise.resolve
:
function crazyTown () {
if ( Math.random() < 0.5 ) {
return 'sync!';
} else {
return new Promise( function ( fulfil, reject ) {
setTimeout( function () {
fulfil( 'async!' );
}, 500 );
});
}
}
Promise.resolve( crazyTown() ).then( function ( type ) {
console.log( type );
});
如果您的浏览器本身支持promises,Ractive将使用这些(即Ractive.Promise === window.Promise
) - 如果没有,它会使用自己的符合规范的实现。