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”除了这个函数之外在其他任何地方使用。为了理解这段代码,我是否需要了解一些模式?
了解上面这三行代码的用法会很好。这是什么
它看起来像是通过向承诺链(队列)添加所有新承诺来解决并发问题的尝试。我根据您的代码编写了一个简化的示例,演示了它的工作原理
每行的具体功能:
为什么它是并发问题的糟糕解决方案(我的观点)
someAction
,那个么队列可能会长得无法控制非常感谢您提供了带有注释/示例的详细解决方案……因此,如果我必须总结我的理解,那么代码似乎是在试图阻止可能同时发生的多个操作(比如从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);