如何在RactiveJS中使用Promises?

时间:2015-04-06 14:18:06

标签: promise ractivejs

虽然有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处理。

1 个答案:

答案 0 :(得分:3)

这是一个关于承诺的问题,而不是关于Ractive的问题,所以this MDN article值得一读,尽管它有点重。

但基本上,如果您想等到几个操作完成,请使用Promise.all

var ready = Promise.all([
  getJSON( '/data.json' ), // async (returns a promise)
  domReady(),              // async
  reticulateSplines()      // sync
]);

getJSONdomReady将同时执行。 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) - 如果没有,它会使用自己的符合规范的实现。