Javascript 我如何理解代码中承诺的这种习惯用法

Javascript 我如何理解代码中承诺的这种习惯用法,javascript,ember.js,promise,rsvp-promise,Javascript,Ember.js,Promise,Rsvp 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.myPendingPromis

我在我的申请中使用了一些承诺代码,如下所示

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”除了这个函数之外在其他任何地方使用。为了理解这段代码,我是否需要了解一些模式? 了解上面这三行代码的用法会很好。

这是什么 它看起来像是通过向承诺链(队列)添加所有新承诺来解决并发问题的尝试。我根据您的代码编写了一个简化的示例,演示了它的工作原理

每行的具体功能: 为什么它是并发问题的糟糕解决方案(我的观点)
  • 有点难以阅读和理解
  • 若promise需要很长时间才能完成,并且多次调用了
    someAction
    ,那个么队列可能会长得无法控制
  • 似乎没有任何东西向用户表明有东西正在运行
  • 什么是好的解决方案(再说一遍,我的观点)
  • 使用类库管理并发性
  • 避免对并发问题使用队列策略。如果您需要使用“队列”策略,请采取措施限制队列长度
  • 添加一些指示,以便用户看到按钮工作,请求正在发生。使用ember并发很容易做到

  • 非常感谢您提供了带有注释/示例的详细解决方案……因此,如果我必须总结我的理解,那么代码似乎是在试图阻止可能同时发生的多个操作(比如从UI)的执行,而不是将它们排队。这是正确的吗?只是一个简单的后续问题;使用async/await是否可能有相同的行为,即让代码显式地等待前面的承诺得到解决?@testndtv我认为它不能有效地重新写入async/await语法
    //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);