-1

我在我的应用程序中使用了一些 Promise 代码,如下所示;

import { Promise, resolve, all } from 'rsvp';


someAction: function(secId, fld, callback) {
    var self = this;
    var section = self.findSection(self.get('allSecs'), secId);
    var myPendingPromise = section.myPendingPromise || resolve();
    myPendingPromise = myPendingPromise.then(function(){
        return self.myCustomPromise(secId, fld, callback);
    });
    set(section, 'myPendingPromise', myPendingPromise);
},


myCustomPromise: function(secId, fld, callback){
    var self = this;
    return new Promise(function(resolve, reject){
        var deferred = self.myCustomRule(someFlds); //Makes an API call
        deferred.then(function(response) {
            resolve(response);
        }, function(){
            resolve(true);
        });
    });
},

现在,我有点困惑为什么要专门添加以下几行;

var myPendingPromise = section.myPendingPromise || resolve();
myPendingPromise = myPendingPromise.then(function(){
    return self.myCustomPromise(secId, fld, callback);
});
set(section, 'myPendingPromise', myPendingPromise); 

此外,我没有发现“myPendingPromise”在除此功能之外的其他任何地方使用。是否有一些我需要注意的模式才能理解这段代码?了解上面这 3 行代码的用法会很棒。

4

1 回答 1

2

那是什么

它看起来像是通过将所有新的 Promise 添加到 Promise 链(队列)来解决并发问题的尝试。我根据您的代码准备了一个简化的示例来演示它是如何工作的。

每行的具体作用:

//Extract pending promise from section object. If undefined, use resolve() 
//to create and resolve dummy promise:
var myPendingPromise = section.myPendingPromise || resolve();

//Add new promise to chain, so it would start after 
//pending promise is resolved:
myPendingPromise = myPendingPromise.then(function(){
    return self.myCustomPromise(secId, fld, callback);
});

//Save new promise chain into section object:
set(section, 'myPendingPromise', myPendingPromise); 

为什么它是并发问题的糟糕解决方案(我的观点)

  1. 有点难以阅读和理解
  2. 如果 Promise 需要很长时间才能完成并且someAction被多次调用,则队列可能会变得无法控制地长
  3. 似乎没有任何东西向用户表明正在运行

什么是好的解决方案(再次,我的观点)

  1. 使用ember-concurrency 之类的库来管理并发
  2. 避免对并发问题使用队列策略。如果需要使用“队列”策略,采取措施限制队列长度
  3. 添加一些指示,以便用户看到该按钮有效并且请求正在发生。使用 ember-concurrency 很容易做到
于 2020-01-03T19:14:40.180 回答