首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ecma6承诺:如何使用Ecma6承诺重写jquery $.when?

Ecma6承诺:如何使用Ecma6承诺重写jquery $.when?
EN

Stack Overflow用户
提问于 2017-05-30 14:14:21
回答 2查看 66关注 0票数 0

我试图用ecma6承诺重写辛佩尔$.when

代码语言:javascript
复制
var d1 = $.Deferred();
var d2 = $.Deferred();

$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
});

d1.resolve( "Fish" );
d2.resolve( "Pizza" );

有什么办法利用新的承诺吗?

问候

我们的目标是解决承诺范围之外的承诺。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-30 14:43:32

可以通过多种方式编写承诺,这取决于您的需要,因此这3个示例应该接近您的jQuery示例:

代码语言:javascript
复制
var d1 = (v)=>new Promise(r=>r(v))
var d2 = (v)=>new Promise(r=>r(v))
var dd1 = d1('Fish')
var dd2 = d2('Pizza')

Promise.all([dd1, dd2]).then(( v )=>{
    console.log( v[0]+', '+v[1] );
});

//or

var d1 = new Promise(r=>r('Fish'))
var d2 = new Promise(r=>r('Pizza'))

Promise.all([d1, d2]).then(( v )=>{
    console.log( v[0]+', '+v[1] );
});

//or

var d1 = Promise.resolve('Fish')
var d2 = Promise.resolve('Pizza')

Promise.all([d1, d2]).then(( v )=>{
    console.log( v[0]+', '+v[1] );
});

好的,下面是如何从外部解决这个问题:

代码语言:javascript
复制
var reolveMe = [];

var d1 = new Promise(r=>reolveMe.push(r))
var d2 = new Promise(r=>reolveMe.push(r))

Promise.all([d1, d2]).then(( v )=>{
    console.log( v[0]+', '+v[1] );
});

reolveMe[0]('a')
reolveMe[1]('b')

//or more OOP

function myPromise() {
  var myResolve;
  this.promise = new Promise(r=>myResolve=r)
  this.resolve = myResolve;
}

var d1 = new myPromise()
var d2 = new myPromise()

Promise.all([d1.promise, d2.promise]).then(( v )=>{
    console.log( v[0]+', '+v[1] );
});

d1.resolve('a')
d2.resolve('b')

票数 2
EN

Stack Overflow用户

发布于 2017-05-30 14:28:56

jQuery的时间似乎有几个不同的语法来解决多个承诺。我能想到的最接近的就是使用Promise.all。

代码语言:javascript
复制
let p1 = new Promise((resolve) => resolve('Pizza'));
let p2 = new Promise((resolve) => resolve('Fish'));

Promise.all([p1, p2]).then((values) => {
 console.log(values[0]); //Pizza
 console.log(values[1]); //Fish
});

JS承诺API与jQuery提供的内容不完全匹配。例如,Promise.defer()是一个不推荐的方法。在MDN 这一页上有一个延迟的示例。

基于MDN片段的类实现:

代码语言:javascript
复制
class Deferred {
  constructor() {
   this.promise = new Promise((resolve, reject) => {
     this.resolve = resolve;
     this.reject = reject
   });
  }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44264713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档