为啥在两次调用 promise 时 RSVP Deferred 会产生错误

Posted

技术标签:

【中文标题】为啥在两次调用 promise 时 RSVP Deferred 会产生错误【英文标题】:Why RSVP Deferred produces error when promise is called twice为什么在两次调用 promise 时 RSVP Deferred 会产生错误 【发布时间】:2018-07-17 00:52:41 【问题描述】:

为什么在两次调用 promise 时 RSVP Deferred 会产生错误?

deferred.promise.then().finally()deferred.promise.then(); deferred.promise.finally() 似乎有区别。为什么?

RSVP.on('error', function(reason) 
  console.log('Error: ' + reason);
);

var deferred = RSVP.defer();
var deferred2 = RSVP.defer();
var deferred3 = RSVP.defer();
var promise3 = deferred3.promise;

deferred.promise.then(function() 
  console.log('Resolved');
, function() 
  console.log('Rejected');
).finally(function() 
  console.log('Finally');
);

deferred2.promise.then(function() 
  console.log('Resolved2');
, function() 
  console.log('Rejected2');
);

deferred2.promise.finally(function() 
  console.log('Finally2');
);

promise3 = promise3.then(function() 
  console.log('Resolved3');
, function() 
  console.log('Rejected');
);

promise3.finally(function() 
  console.log('Finally3');
);


deferred.reject('Reject!');
deferred2.reject('Reject2!');
deferred3.reject('Reject3!');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rsvp/4.8.1/rsvp.js"></script>

编辑:我发现了如何解决这个问题。查看代码中的 Deferred3。

【问题讨论】:

我发现了问题,请参阅我的示例中的 deferred3! 如果您发现问题,请answer your own question 或直接删除。 【参考方案1】:

我发现promise.then()(和其他方法)返回一个修改过的承诺,所以你必须链接thenfinallycatch...方法,否则你必须每次都保存promise .

RSVP.on('error', function(reason) 
  console.log('Error: ' + reason);
);

var deferred = RSVP.defer();
var promise = deferred.promise;

promise = promise.then(function() 
  console.log('Resolved');
, function() 
  console.log('Rejected');
);

promise.finally(function() 
  console.log('Finally');
);


deferred.reject('Reject!');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rsvp/4.8.1/rsvp.js"></script>

【讨论】:

以上是关于为啥在两次调用 promise 时 RSVP Deferred 会产生错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用promise时使用Q,bluebird框架? [复制]

为啥构造 std::thread 时参数移动了两次

如何按顺序执行一系列承诺?

RSVP Promises:then() 链返回链的第一个值

Ember.RSVP.all 似乎立即解决

为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?